Răsfoiți Sursa

dnetview: trick to return View error from anon closure

due to the issue of returning a value inside an anonymous closure, we
process errors received from View as follows:

let mut err: Option<DnetViewError> = None;

terminal.draw(|f| match view.render(f) {
    Ok(()) => {}
    Err(e) => {
        err = Some(e);
    }
})?;

match err {
    Some(e) => return Err(e),
    None => {}
}

we create a None option wrapper around DnetViewError. we then write the
error value to the option, and later perform a match on the error and
return.
lunar-mining 4 ani în urmă
părinte
comite
5f1085853c
1 a modificat fișierele cu 9 adăugiri și 2 ștergeri
  1. 9 2
      bin/dnetview/src/main.rs

+ 9 - 2
bin/dnetview/src/main.rs

@@ -454,13 +454,20 @@ async fn render_view<B: Backend>(
             model.selectables.lock().await.clone(),
         );
 
-        // TODO: we can't return errors from inside an anonymous closure :(
+        let mut err: Option<DnetViewError> = None;
+
         terminal.draw(|f| match view.render(f) {
             Ok(()) => {}
             Err(e) => {
-                debug!("{}", e);
+                err = Some(e);
             }
         })?;
+
+        match err {
+            Some(e) => return Err(e),
+            None => {}
+        }
+
         for k in asi.by_ref().keys() {
             match k.unwrap() {
                 Key::Char('q') => {