use serde_json::Value;
pub trait ProtocolError: core::fmt::Debug + Send + Sync + Sized + 'static {
fn code(&self) -> &str;
fn description(&self) -> &str;
fn details(&self) -> &Value;
fn not_implemented(action: &str) -> Self;
fn from_wire(code: &str, description: &str, details: Value) -> Self;
}
#[derive(Debug)]
pub enum ClientError<E> {
Protocol(E),
Timeout,
Decode(serde_json::Error),
Transport(crate::transport::TransportError),
Closed,
}
impl<E: ProtocolError> core::fmt::Display for ClientError<E> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
ClientError::Protocol(e) => {
write!(f, "protocol error: {} ({})", e.code(), e.description())
}
ClientError::Timeout => write!(f, "request timed out"),
ClientError::Decode(e) => write!(f, "failed to decode payload: {e}"),
ClientError::Transport(e) => write!(f, "transport error: {e}"),
ClientError::Closed => write!(f, "connection closed"),
}
}
}
impl<E: ProtocolError> core::error::Error for ClientError<E> {}