blob: 755b3fd9596240b7660bd38b9053f4387f68d218 [file] [log] [blame]
use std::fmt;
use crate::{Notification, Request};
#[derive(Debug, Clone, PartialEq)]
pub struct ProtocolError(pub(crate) String);
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<T> {
/// 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<Request> {}
impl fmt::Display for ExtractError<Request> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
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<Notification> {}
impl fmt::Display for ExtractError<Notification> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ExtractError::MethodMismatch(req) => {
write!(f, "Method mismatch for notification '{}'", req.method)
}
ExtractError::JsonError { method, error } => {
write!(f, "Invalid notification\nMethod: {method}\n error: {error}")
}
}
}
}