channel_buffer.rs

  1use crate::ChannelId;
  2use anyhow::Result;
  3use client::Client;
  4use gpui::{AppContext, AsyncAppContext, Entity, ModelContext, ModelHandle, Task};
  5use rpc::{proto, TypedEnvelope};
  6use std::sync::Arc;
  7use util::ResultExt;
  8
  9// Open the channel document
 10// ChannelDocumentView { ChannelDocument, Editor } -> On clone, clones internal ChannelDocument handle, instantiates new editor
 11// Produces a view which is: (ChannelDocument, Editor), ChannelDocument manages subscriptions
 12// ChannelDocuments -> Buffers -> Editor with that buffer
 13
 14// ChannelDocuments {
 15//     ChannleBuffers: HashMap<bufferId, ModelHandle<language::Buffer>>
 16// }
 17
 18type BufferId = u64;
 19
 20pub struct ChannelBuffer {
 21    channel_id: ChannelId,
 22    buffer_id: BufferId,
 23    buffer: ModelHandle<language::Buffer>,
 24    client: Arc<Client>,
 25}
 26
 27impl Entity for ChannelBuffer {
 28    type Event = ();
 29}
 30
 31impl ChannelBuffer {
 32    pub fn for_channel(
 33        channel_id: ChannelId,
 34        client: Arc<Client>,
 35        cx: &mut AppContext,
 36    ) -> Task<Result<ModelHandle<Self>>> {
 37        cx.spawn(|mut cx| async move {
 38            let response = client
 39                .request(proto::OpenChannelBuffer { channel_id })
 40                .await?;
 41
 42            let base_text = response.base_text;
 43            let operations = response
 44                .operations
 45                .into_iter()
 46                .map(language::proto::deserialize_operation)
 47                .collect::<Result<Vec<_>, _>>()?;
 48            let buffer_id = response.buffer_id;
 49
 50            let buffer = cx.add_model(|cx| language::Buffer::new(0, base_text, cx));
 51            buffer.update(&mut cx, |buffer, cx| buffer.apply_ops(operations, cx))?;
 52
 53            anyhow::Ok(cx.add_model(|cx| {
 54                cx.subscribe(&buffer, Self::on_buffer_update).detach();
 55                client.add_model_message_handler(Self::handle_update_channel_buffer);
 56                Self {
 57                    buffer_id,
 58                    buffer,
 59                    client,
 60                    channel_id,
 61                }
 62            }))
 63        })
 64    }
 65
 66    async fn handle_update_channel_buffer(
 67        this: ModelHandle<Self>,
 68        update_channel_buffer: TypedEnvelope<proto::UpdateChannelBuffer>,
 69        _: Arc<Client>,
 70        mut cx: AsyncAppContext,
 71    ) -> Result<()> {
 72        let ops = update_channel_buffer
 73            .payload
 74            .operations
 75            .into_iter()
 76            .map(language::proto::deserialize_operation)
 77            .collect::<Result<Vec<_>, _>>()?;
 78
 79        this.update(&mut cx, |this, cx| {
 80            this.buffer
 81                .update(cx, |buffer, cx| buffer.apply_ops(ops, cx))
 82        })?;
 83
 84        Ok(())
 85    }
 86
 87    fn on_buffer_update(
 88        &mut self,
 89        _: ModelHandle<language::Buffer>,
 90        event: &language::Event,
 91        _: &mut ModelContext<Self>,
 92    ) {
 93        if let language::Event::Operation(operation) = event {
 94            let operation = language::proto::serialize_operation(operation);
 95            self.client
 96                .send(proto::UpdateChannelBuffer {
 97                    buffer_id: self.buffer_id,
 98                    operations: vec![operation],
 99                })
100                .log_err();
101        }
102    }
103
104    pub fn buffer(&self) -> ModelHandle<language::Buffer> {
105        self.buffer.clone()
106    }
107}