53 lines
1.1 KiB
Rust
53 lines
1.1 KiB
Rust
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<T, E> UnwrapLog for Result<T, E>
|
|
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::<Self::Target>()
|
|
);
|
|
debug!("^ defaulting to {default:#?}");
|
|
default
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
impl<T> UnwrapLog for Option<T>
|
|
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::<Self::Target>()
|
|
);
|
|
debug!("^ defaulting to {default:#?}");
|
|
default
|
|
}
|
|
}
|
|
}
|
|
}
|