chiark / gitweb /
utils: Introduce anyhow::Error::for_each
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 1 Jun 2021 19:57:49 +0000 (20:57 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 1 Jun 2021 19:57:49 +0000 (20:57 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/utils.rs

index 9ce62a28d8a909f2671a2e1d433f54a043e07ab8..7a9f5e27c26588c64a0901a1c979482dbb87a314 100644 (file)
@@ -643,9 +643,19 @@ impl<I,T> IndexVec<I,T> where I: index_vec::Idx {
   }
 }
 
-
 #[ext(pub)]
 impl anyhow::Error {
+  fn for_each(&self, f: &mut dyn FnMut(&str) -> fmt::Result) -> fmt::Result {
+    let mut done = String::new();
+    for e in self.chain() {
+      let s = e.to_string();
+      if done.contains(&s) { continue }
+      f(&s)?;
+      done = s;
+    }
+    Ok(())
+  }
+
   fn end_process(self, estatus: u8) -> ! {
     #[derive(Default,Debug)] struct Sol { any: bool }
     impl Sol {
@@ -659,17 +669,14 @@ impl anyhow::Error {
       }
     }
     let mut sol: Sol = default();
-    let mut printed = String::new();
-    for e in self.chain() {
-      let s = e.to_string();
-      if printed.contains(&s) { continue }
+    self.for_each(&mut |s|{
       let long = s.len() > 80;
       if long && sol.any { sol.nl() }
       sol.head();
       eprint!(": {}", &s);
       if long { sol.nl() }
-      printed = s;
-    }
+      Ok::<_,fmt::Error>(())
+    }).unwrap();
     sol.nl();
     assert!(estatus > 0);
     exit(estatus.into());