channel_buffer.rs

 1use crate::ChannelId;
 2use anyhow::Result;
 3use client::Client;
 4use gpui::{Entity, ModelContext, ModelHandle, Task};
 5use rpc::proto::GetChannelBuffer;
 6use std::sync::Arc;
 7
 8// Open the channel document
 9// ChannelDocumentView { ChannelDocument, Editor } -> On clone, clones internal ChannelDocument handle, instantiates new editor
10// Produces a view which is: (ChannelDocument, Editor), ChannelDocument manages subscriptions
11// ChannelDocuments -> Buffers -> Editor with that buffer
12
13// ChannelDocuments {
14//     ChannleBuffers: HashMap<bufferId, ModelHandle<language::Buffer>>
15// }
16
17pub struct ChannelBuffer {
18    channel_id: ChannelId,
19    buffer: Option<ModelHandle<language::Buffer>>,
20    client: Arc<Client>,
21}
22
23impl Entity for ChannelBuffer {
24    type Event = ();
25}
26
27impl ChannelBuffer {
28    pub fn for_channel(
29        channel_id: ChannelId,
30        client: Arc<Client>,
31        cx: &mut ModelContext<Self>,
32    ) -> Self {
33        Self {
34            channel_id,
35            client,
36            buffer: None,
37        }
38    }
39
40    fn on_buffer_update(
41        &mut self,
42        buffer: ModelHandle<language::Buffer>,
43        event: &language::Event,
44        cx: &mut ModelContext<Self>,
45    ) {
46        //
47    }
48
49    pub fn buffer(
50        &mut self,
51        cx: &mut ModelContext<Self>,
52    ) -> Task<Result<ModelHandle<language::Buffer>>> {
53        if let Some(buffer) = &self.buffer {
54            Task::ready(Ok(buffer.clone()))
55        } else {
56            let channel_id = self.channel_id;
57            let client = self.client.clone();
58            cx.spawn(|this, mut cx| async move {
59                let response = client.request(GetChannelBuffer { channel_id }).await?;
60
61                let base_text = response.base_text;
62                let operations = response
63                    .operations
64                    .into_iter()
65                    .map(language::proto::deserialize_operation)
66                    .collect::<Result<Vec<_>, _>>()?;
67
68                this.update(&mut cx, |this, cx| {
69                    let buffer = cx.add_model(|cx| language::Buffer::new(0, base_text, cx));
70                    buffer.update(cx, |buffer, cx| buffer.apply_ops(operations, cx))?;
71
72                    cx.subscribe(&buffer, Self::on_buffer_update).detach();
73
74                    this.buffer = Some(buffer.clone());
75                    anyhow::Ok(buffer)
76                })
77            })
78        }
79    }
80}