From 3c8aa0ee708fea214d4f6524858261499870b8e0 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 30 Jun 2021 11:47:13 +0200 Subject: [PATCH] Move `remote::update_buffer` main logic into `Worktree::update_buffer` --- zed/src/worktree.rs | 61 ++++++++++++++++++--------------------------- 1 file changed, 24 insertions(+), 37 deletions(-) diff --git a/zed/src/worktree.rs b/zed/src/worktree.rs index 45b0f23bca7d3de102ed6e6df009e4b6991190ef..d8e96560036ba887fdf8e680580d4e89dea36eb6 100644 --- a/zed/src/worktree.rs +++ b/zed/src/worktree.rs @@ -32,6 +32,7 @@ use smol::{ use std::{ cmp, collections::HashMap, + convert::TryInto, ffi::{OsStr, OsString}, fmt, fs, future::Future, @@ -183,28 +184,31 @@ impl Worktree { .is_some() } - pub fn buffer(&self, id: u64, cx: &AppContext) -> Option> { - let open_buffers = match self { - Worktree::Local(worktree) => &worktree.open_buffers, - Worktree::Remote(worktree) => &worktree.open_buffers, - }; - - open_buffers - .get(&(id as usize)) - .and_then(|buffer| buffer.upgrade(cx)) - } - - pub fn buffers<'a>( - &'a self, - cx: &'a AppContext, - ) -> impl 'a + Iterator> { + pub fn update_buffer( + &mut self, + envelope: proto::UpdateBuffer, + cx: &mut ModelContext, + ) -> Result<()> { let open_buffers = match self { Worktree::Local(worktree) => &worktree.open_buffers, Worktree::Remote(worktree) => &worktree.open_buffers, }; - open_buffers - .values() - .filter_map(move |buffer| buffer.upgrade(cx)) + let buffer = open_buffers + .get(&(envelope.buffer_id as usize)) + .and_then(|buf| buf.upgrade(&cx)) + .ok_or_else(|| { + anyhow!( + "invalid buffer {} in update buffer message", + envelope.buffer_id + ) + })?; + let ops = envelope + .operations + .into_iter() + .map(|op| op.try_into()) + .collect::>>()?; + buffer.update(cx, |buffer, cx| buffer.apply_ops(ops, cx))?; + Ok(()) } fn save( @@ -1923,7 +1927,6 @@ impl<'a> Iterator for ChildEntriesIter<'a> { mod remote { use super::*; use crate::rpc::TypedEnvelope; - use std::convert::TryInto; pub async fn open_buffer( envelope: TypedEnvelope, @@ -1979,25 +1982,9 @@ mod remote { let mut state = rpc.state.lock().await; match state.shared_worktree(message.worktree_id, cx) { Ok(worktree) => { - if let Some(buffer) = - worktree.read_with(cx, |w, cx| w.buffer(message.buffer_id, cx)) + if let Err(error) = worktree.update(cx, |tree, cx| tree.update_buffer(message, cx)) { - if let Err(error) = buffer.update(cx, |buffer, cx| { - let ops = message - .operations - .into_iter() - .map(|op| op.try_into()) - .collect::>>()?; - buffer.apply_ops(ops, cx)?; - Ok::<(), anyhow::Error>(()) - }) { - log::error!("error applying buffer operations {}", error); - } - } else { - log::error!( - "invalid buffer {} in update buffer message", - message.buffer_id - ); + log::error!("error applying operations to buffer: {}", error); } } Err(error) => log::error!("{}", error),