mirror of
				https://github.com/eyre-rs/eyre.git
				synced 2025-11-03 23:13:56 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			82 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
use backtrace::Backtrace;
 | 
						|
use eyre::EyreHandler;
 | 
						|
use std::error::Error;
 | 
						|
use std::{fmt, iter};
 | 
						|
 | 
						|
fn main() -> eyre::Result<()> {
 | 
						|
    // Install our custom eyre report hook for constructing our custom Handlers
 | 
						|
    install().unwrap();
 | 
						|
 | 
						|
    // construct a report with, hopefully, our custom handler!
 | 
						|
    let mut report = eyre::eyre!("hello from custom error town!");
 | 
						|
 | 
						|
    // manually set the custom msg for this report after it has been constructed
 | 
						|
    if let Some(handler) = report.handler_mut().downcast_mut::<Handler>() {
 | 
						|
        handler.custom_msg = Some("you're the best users, you know that right???");
 | 
						|
    }
 | 
						|
 | 
						|
    // print that shit!!
 | 
						|
    Err(report)
 | 
						|
}
 | 
						|
 | 
						|
// define a handler that captures backtraces unless told not to
 | 
						|
fn install() -> Result<(), impl Error> {
 | 
						|
    let capture_backtrace = std::env::var("RUST_BACKWARDS_TRACE")
 | 
						|
        .map(|val| val != "0")
 | 
						|
        .unwrap_or(true);
 | 
						|
 | 
						|
    let hook = Hook { capture_backtrace };
 | 
						|
 | 
						|
    eyre::set_hook(Box::new(move |e| Box::new(hook.make_handler(e))))
 | 
						|
}
 | 
						|
 | 
						|
struct Hook {
 | 
						|
    capture_backtrace: bool,
 | 
						|
}
 | 
						|
 | 
						|
impl Hook {
 | 
						|
    fn make_handler(&self, _error: &(dyn Error + 'static)) -> Handler {
 | 
						|
        let backtrace = if self.capture_backtrace {
 | 
						|
            Some(Backtrace::new())
 | 
						|
        } else {
 | 
						|
            None
 | 
						|
        };
 | 
						|
 | 
						|
        Handler {
 | 
						|
            backtrace,
 | 
						|
            custom_msg: None,
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
struct Handler {
 | 
						|
    // custom configured backtrace capture
 | 
						|
    backtrace: Option<Backtrace>,
 | 
						|
    // customizable message payload associated with reports
 | 
						|
    custom_msg: Option<&'static str>,
 | 
						|
}
 | 
						|
 | 
						|
impl EyreHandler for Handler {
 | 
						|
    fn debug(&self, error: &(dyn Error + 'static), f: &mut fmt::Formatter<'_>) -> fmt::Result {
 | 
						|
        if f.alternate() {
 | 
						|
            return fmt::Debug::fmt(error, f);
 | 
						|
        }
 | 
						|
 | 
						|
        let errors = iter::successors(Some(error), |error| (*error).source());
 | 
						|
 | 
						|
        for (ind, error) in errors.enumerate() {
 | 
						|
            write!(f, "\n{:>4}: {}", ind, error)?;
 | 
						|
        }
 | 
						|
 | 
						|
        if let Some(backtrace) = self.backtrace.as_ref() {
 | 
						|
            writeln!(f, "\n\nBacktrace:\n{:?}", backtrace)?;
 | 
						|
        }
 | 
						|
 | 
						|
        if let Some(msg) = self.custom_msg.as_ref() {
 | 
						|
            writeln!(f, "\n\n{}", msg)?;
 | 
						|
        }
 | 
						|
 | 
						|
        Ok(())
 | 
						|
    }
 | 
						|
}
 |