use std::fmt::Display; pub trait LogErrorResult { fn log_err(self) -> Result; } impl LogErrorResult for Result { fn log_err(self) -> Result { self.map_err(|err| { error!("{}", err.to_string()); err }) } } trait ResultOps { fn tap U>(self, op: F) -> Result; fn tap_err F>(self, op: O) -> Result; } impl ResultOps for Result { fn tap U>(self, op: F) -> Result { self.map(|x| { op(x.clone()); x }) } fn tap_err F>(self, op: O) -> Result { self.map_err(|err| { op(err.clone()); err }) } }