use std;
use std::error::Error as StdError;
use std::fmt::Debug;
use futures::Future;
error_chain!{
errors {
MissingCache(err: std::io::Error) {
cause(err)
description(err.description())
}
}
}
pub trait ResultLoggingExt<M: Debug + Send + Sync>: Sized {
fn log<F>(self, message_fn: F) -> Self
where
F: Fn(&M) + Send + Sync + 'static;
}
impl<M: Debug + Send + Sync> ResultLoggingExt<M> for Result<M> {
fn log<F>(self, message_fn: F) -> Self
where
F: Fn(&M) + Send + Sync + 'static,
{
match self {
Ok(ref contents) => message_fn(contents),
Err(ref e) => error!("{:?}", e),
}
self
}
}
pub trait FutureLoggingExt<M: Debug + Send + Sync>: Sized + Future {
fn log<F>(self, message_fn: F) -> Box<Future<Item = Self::Item, Error = Self::Error> + Send>
where
F: Fn(&M) + Send + Sync + 'static;
}
impl<M, Fut> FutureLoggingExt<M> for Fut
where
M: Debug + Send + Sync + 'static,
Fut: Future<Item = M, Error = Error> + Send + 'static,
{
fn log<F>(self, message_fn: F) -> Box<Future<Item = Self::Item, Error = Self::Error> + Send>
where
F: Fn(&M) + Send + Sync + 'static,
{
Box::new(self.then(move |a| {
match a {
Ok(ref b) => message_fn(b),
Err(ref e) => error!("{:?}", e),
}
a
}))
}
}