WIP

Antonio Scandurra created

Change summary

crates/gpui/src/app.rs                  | 15 +++++++++++----
crates/gpui/src/app/test_app_context.rs |  2 ++
crates/gpui/src/app/window.rs           |  4 +++-
crates/workspace/src/dock.rs            |  2 ++
crates/workspace/src/item.rs            |  2 +-
5 files changed, 19 insertions(+), 6 deletions(-)

Detailed changes

crates/gpui/src/app.rs 🔗

@@ -173,11 +173,13 @@ pub trait ReadViewWith {
 }
 
 pub trait UpdateView {
+    type Output<S>;
+
     fn update_view<T, S>(
         &mut self,
         handle: &ViewHandle<T>,
         update: &mut dyn FnMut(&mut T, &mut ViewContext<T>) -> S,
-    ) -> S
+    ) -> Self::Output<S>
     where
         T: View;
 }
@@ -462,18 +464,19 @@ impl ReadModelWith for AsyncAppContext {
 }
 
 impl UpdateView for AsyncAppContext {
+    type Output<S> = Option<S>;
+
     fn update_view<T, S>(
         &mut self,
         handle: &ViewHandle<T>,
         update: &mut dyn FnMut(&mut T, &mut ViewContext<T>) -> S,
-    ) -> S
+    ) -> Option<S>
     where
         T: View,
     {
         self.0
             .borrow_mut()
             .update_window(handle.window_id, |cx| cx.update_view(handle, update))
-            .unwrap() // TODO: is this unwrap safe?
     }
 }
 
@@ -3472,6 +3475,8 @@ impl<V: View> ReadView for ViewContext<'_, '_, '_, V> {
 }
 
 impl<V: View> UpdateView for ViewContext<'_, '_, '_, V> {
+    type Output<S> = S;
+
     fn update_view<T, S>(
         &mut self,
         handle: &ViewHandle<T>,
@@ -3533,6 +3538,8 @@ impl<V: View> ReadView for EventContext<'_, '_, '_, '_, V> {
 }
 
 impl<V: View> UpdateView for EventContext<'_, '_, '_, '_, V> {
+    type Output<S> = S;
+
     fn update_view<T, S>(
         &mut self,
         handle: &ViewHandle<T>,
@@ -3913,7 +3920,7 @@ impl<T: View> ViewHandle<T> {
         })
     }
 
-    pub fn update<C, F, S>(&self, cx: &mut C, update: F) -> S
+    pub fn update<C, F, S>(&self, cx: &mut C, update: F) -> C::Output<S>
     where
         C: UpdateView,
         F: FnOnce(&mut T, &mut ViewContext<T>) -> S,

crates/gpui/src/app/test_app_context.rs 🔗

@@ -404,6 +404,8 @@ impl ReadModelWith for TestAppContext {
 }
 
 impl UpdateView for TestAppContext {
+    type Output<S> = S;
+
     fn update_view<T, S>(
         &mut self,
         handle: &ViewHandle<T>,

crates/gpui/src/app/window.rs 🔗

@@ -155,6 +155,8 @@ impl ReadView for WindowContext<'_, '_> {
 }
 
 impl UpdateView for WindowContext<'_, '_> {
+    type Output<S> = S;
+
     fn update_view<T, S>(
         &mut self,
         handle: &ViewHandle<T>,
@@ -172,7 +174,7 @@ impl UpdateView for WindowContext<'_, '_> {
                 &mut cx,
             )
         })
-        .unwrap() // TODO: Is this unwrap safe?
+        .unwrap()
     }
 }
 

crates/workspace/src/dock.rs 🔗

@@ -823,6 +823,8 @@ mod tests {
     }
 
     impl<'a> UpdateView for DockTestContext<'a> {
+        type Output<S> = S;
+
         fn update_view<T, S>(
             &mut self,
             handle: &ViewHandle<T>,

crates/workspace/src/item.rs 🔗

@@ -467,7 +467,7 @@ impl<T: Item> ItemHandle for ViewHandle<T> {
                                                     workspace.project().clone(),
                                                     cx,
                                                 )
-                                            })
+                                            })?
                                             .await
                                             .log_err()?;
                                         Some(())