use std::{error::Error, fmt::Debug}; use log::{debug, error}; pub trait UnwrapLog { type Target; fn unwrap_or_log(self, default: Self::Target) -> Self::Target; } impl UnwrapLog for Result where T: Debug, E: Error, { type Target = T; fn unwrap_or_log(self, default: Self::Target) -> Self::Target { match self { Ok(val) => val, Err(err) => { error!( "[{}] unwrap_or_log got error: {err}", std::any::type_name::() ); debug!("^ defaulting to {default:#?}"); default } } } } impl UnwrapLog for Option where T: Debug, { type Target = T; fn unwrap_or_log(self, default: Self::Target) -> Self::Target { match self { Some(v) => v, None => { error!( "[{}] unwrap_or_log was None", std::any::type_name::() ); debug!("^ defaulting to {default:#?}"); default } } } }