use log::error;
use std::fmt::Debug;
pub trait LogErrResult<T, E: Debug> {
fn log_unwrap (self) -> T;
fn log_expect (self, msg: &str) -> T;
}
pub trait LogErrOption<T> {
fn log_unwrap (self) -> T;
fn log_expect (self, msg: &str) -> T;
}
impl<T> LogErrOption<T> for Option<T> {
fn log_unwrap (self) -> T {
match self {
Some (n) => n,
None => {
error!("called `Option::unwrap()` on a `None` value");
self.unwrap()
}
}
}
fn log_expect (self, msg: &str) -> T {
match self {
Some (n) => n,
None => {
error!("{}", msg);
self.expect(msg)
},
}
}
}
impl<T, E: Debug> LogErrResult<T, E> for Result<T, E> {
fn log_unwrap (self) -> T {
self.map_err(|e| {error!("called `Result::unwrap()` on an `Err` value: {:?}", e); e}).unwrap()
}
fn log_expect (self, msg: &str) -> T {
self.map_err(|e| {error!("{}: {:?}", msg, e); e}).expect(msg)
}
}
#[cfg(test)]
mod test {
use super::*;
use simplelog::SimpleLogger;
static mut LOGGER_SET_UP: bool = false;
fn setup_logger () {
SimpleLogger::init(simplelog::LevelFilter::Debug, simplelog::Config::default()).unwrap();
}
#[test]
#[should_panic(expected = "called `Result::unwrap()` on an `Err` value: \"a wild error has appeared!\"")]
fn test_log_unwrap () {
unsafe {if !LOGGER_SET_UP {setup_logger(); LOGGER_SET_UP = true;}}
Result::<(), &str>::Err("a wild error has appeared!").log_unwrap();
}
#[test]
#[should_panic(expected = "A wild error SHOULD appear")]
fn test_option_log_expect () {
unsafe {if !LOGGER_SET_UP {setup_logger(); LOGGER_SET_UP = true;}}
Option::<()>::None.log_expect("A wild error SHOULD appear");
}
#[test]
#[should_panic(expected = "called `Option::unwrap()` on a `None` value")]
fn test_option_log_unwrap () {
unsafe {if !LOGGER_SET_UP {setup_logger(); LOGGER_SET_UP = true;}}
Option::<()>::None.log_unwrap();
}
}