use std::fmt; use jsonrpc_core::{Error as JsonRpcError, ErrorCode}; use serde_json::error::Error as SerdeJsonError; use peach_stats::StatsError; /// Custom error type encapsulating all possible errors for a JSON-RPC server /// and associated methods. #[derive(Debug)] pub enum JsonRpcServerError { /// Failed to serialize a string from a data structure. Serde(SerdeJsonError), /// An error returned from the `peach-stats` library. Stats(StatsError), /// An expected JSON-RPC method parameter was not provided. MissingParameter(JsonRpcError), /// Failed to parse a provided JSON-RPC method parameter. ParseParameter(JsonRpcError), } impl fmt::Display for JsonRpcServerError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match *self { JsonRpcServerError::ParseParameter(ref source) => { write!(f, "Failed to parse parameter: {}", source) } JsonRpcServerError::MissingParameter(ref source) => { write!(f, "Missing expected parameter: {}", source) } JsonRpcServerError::Serde(ref source) => { write!(f, "{}", source) } JsonRpcServerError::Stats(ref source) => { write!(f, "{}", source) } } } } impl From for JsonRpcError { fn from(err: JsonRpcServerError) -> Self { match &err { JsonRpcServerError::Serde(source) => JsonRpcError { code: ErrorCode::ServerError(-32002), message: format!("{}", source), data: None, }, JsonRpcServerError::Stats(source) => JsonRpcError { code: ErrorCode::ServerError(-32001), message: format!("{}", source), data: None, }, JsonRpcServerError::MissingParameter(source) => source.clone(), JsonRpcServerError::ParseParameter(source) => source.clone(), } } }