use std::fmt; use crate::{Notification, Request}; #[derive(Debug, Clone, PartialEq)] pub struct ProtocolError(String, bool); impl ProtocolError { pub(crate) fn new(msg: impl Into) -> Self { ProtocolError(msg.into(), false) } pub(crate) fn disconnected() -> ProtocolError { ProtocolError("disconnected channel".into(), true) } /// Whether this error occurred due to a disconnected channel. pub fn channel_is_disconnected(&self) -> bool { self.1 } } impl std::error::Error for ProtocolError {} impl fmt::Display for ProtocolError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fmt::Display::fmt(&self.0, f) } } #[derive(Debug)] pub enum ExtractError { /// Not found NoResult, /// The extracted message was of a different method than expected. MethodMismatch(T), /// Failed to deserialize the message. JsonError { method: String, error: serde_json::Error }, } impl std::error::Error for ExtractError {} impl fmt::Display for ExtractError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { ExtractError::NoResult => { write!(f, "unfound") } ExtractError::MethodMismatch(req) => { write!(f, "Method mismatch for request '{}'", req.method) } ExtractError::JsonError { method, error } => { write!(f, "Invalid request\nMethod: {method}\n error: {error}",) } } } } impl std::error::Error for ExtractError {} impl fmt::Display for ExtractError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { ExtractError::NoResult => { write!(f, "unfound") } ExtractError::MethodMismatch(req) => { write!(f, "Method mismatch for notification '{}'", req.method) } ExtractError::JsonError { method, error } => { write!(f, "Invalid notification\nMethod: {method}\n error: {error}") } } } }