use color_eyre::eyre::Report; use futility::terminate::Terminate; use std::error::Error; #[test] pub fn terminate_eyre() -> Result<(), Report> { Terminate::new() .at_exit(|| { println!("The program is in the process exiting."); }) .on_error(|err: Report| err.wrap_err("We're at the top of main")) .execute(|| { println!("I'm the actual program and can be both a closure or just a function"); Ok(()) }) } #[test] pub fn terminate_box_err() -> Result<(), Box> { Terminate::new() .at_exit(|| { println!("The program is in the process exiting."); }) .on_error(|err: Box| { if let Some(source) = err.source() { eprintln!("Lower Level Source Error: {source:?}"); } err }) .execute(|| { println!("I'm the actual program and can be both a closure or just a function"); Ok(()) }) } #[test] pub fn terminate_eyre_named_fn() -> Result<(), Report> { Terminate::new() .install(install) .at_exit(at_exit) .on_error(eyre_on_error) .execute(execute) } #[test] pub fn terminate_box_err_named_fn() -> Result<(), Box> { Terminate::new() .at_exit(at_exit) .on_error(box_on_error) .execute(execute) } fn install() -> Result<(), Report> { color_eyre::install()?; Ok(()) } fn eyre_on_error(err: Report) -> Report { err.wrap_err("We're at the top of main") } fn box_on_error(err: Box) -> Box { if let Some(source) = err.source() { eprintln!("Lower Level Source Error: {source:?}"); } err } fn at_exit() { println!("The program is in the process exiting."); } fn execute() -> Result<(), E> { println!("I'm the actual program and can be both a closure or just a function"); Ok(()) }