chiark / gitweb /
eyre: wip experiment, needs some work
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 7 Aug 2021 15:31:26 +0000 (16:31 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 7 Aug 2021 15:59:22 +0000 (16:59 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/bin/client.rs
src/reporter.rs

index b3d7de32c6511b4e09b4dbe21fa9fc3185c153b8..426f974b8f1d38908e0207c9ed78a8aa99271edb 100644 (file)
@@ -336,6 +336,7 @@ async fn run_client<C:HCC>(
 
 #[tokio::main]
 async fn main() -> Result<(), AE> {
+  dedup_eyre_setup()?;
   let opts = Opts::from_args();
 
   let ics = config::read(&opts.config, LinkEnd::Client)?;
index 0d199ecee06a0523586313aebb08f2f0c78fa0e1..dc6f432cd5a02c920c456e62c6a4f6103267ff3c 100644 (file)
@@ -92,13 +92,33 @@ impl<'r> Reporter<'r> {
             write!(m, " ({}ok)", self.successes)?;
             self.successes = 0;
           }
-          write!(m, ": {:?}", e)?;
+          write!(m, ": {}", e)?;
           Ok::<_,fmt::Error>(m)
         })().unwrap();
-        warn!(target:"hippotat", "{}", m);
+        warn!(target:"hippotat", "{:?}", m);
         self.last_report = Some(Report { when: now, ok: Err(()) });
         None
       },
     }
   }
 }
+
+struct EyreDedupHandler;
+type EyreDynError<'r> = &'r (dyn std::error::Error + 'static);
+
+impl eyre::EyreHandler for EyreDedupHandler {
+  #[throws(fmt::Error)]
+  fn debug(&self, error: EyreDynError, f: &mut fmt::Formatter) {
+    Debug::fmt(error, f)?;
+  }
+  #[throws(fmt::Error)]
+  fn display(&self, error: EyreDynError, f: &mut fmt::Formatter) {
+    Display::fmt(error, f)?;
+  }
+}
+
+#[throws(AE)]
+pub fn dedup_eyre_setup() {
+  eyre::set_hook(Box::new(|_error| Box::new(EyreDedupHandler)))
+    .context("set error handler")?;
+}