use err_derive::Error; use std::io; use log::error; #[derive(Debug, Error)] pub enum Error { #[error(display = "IO error: {}", _0)] Io(#[error(source)] io::Error), #[error(display = "Messagepack encode error: {}", _0)] RMPEncode(#[error(source)] rmp_serde::encode::Error), #[error(display = "Messagepack decode error: {}", _0)] RMPDecode(#[error(source)] rmp_serde::decode::Error), #[error(display = "Tokio join error: {}", _0)] TokioJoin(#[error(source)] tokio::task::JoinError), #[error(display = "oneshot receive error: {}", _0)] OneshotRecv(#[error(source)] tokio::sync::oneshot::error::RecvError), #[error(display = "Handshake error: {}", _0)] Handshake(#[error(source)] kuska_handshake::async_std::Error), #[error(display = "{}", _0)] Message(String), #[error(display = "Remote error: {}", _0)] Remote(String), } impl From> for Error { fn from(_e: tokio::sync::watch::error::SendError) -> Error { Error::Message(format!("Watch send error")) } } impl From> for Error { fn from(_e: tokio::sync::mpsc::error::SendError) -> Error { Error::Message(format!("MPSC send error")) } } pub trait LogError { fn log_err(self, msg: &'static str); } impl LogError for Result<(), E> where E: Into, { fn log_err(self, msg: &'static str) { if let Err(e) = self { error!("Error: {}: {}", msg, Into::::into(e)); }; } }