use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Default, PartialEq, Eq, Hash)]
pub struct JsonRpcVersion;
impl JsonRpcVersion {
pub const V2: Self = Self;
#[must_use]
pub const fn as_str(&self) -> &'static str {
"2.0"
}
}
impl serde::Serialize for JsonRpcVersion {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_str(self.as_str())
}
}
impl<'de> serde::Deserialize<'de> for JsonRpcVersion {
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let s = <std::borrow::Cow<'_, str>>::deserialize(deserializer)?;
if s == "2.0" {
Ok(JsonRpcVersion)
} else {
Err(serde::de::Error::custom(format!(
"unsupported JSON-RPC version: expected \"2.0\", got {s:?}"
)))
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct JsonRpcRequest<Params> {
pub jsonrpc: JsonRpcVersion,
pub method: String,
pub id: String,
pub params: Params,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct JsonRpcNotification<Params> {
pub jsonrpc: JsonRpcVersion,
pub method: String,
pub params: Params,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct JsonRpcSuccessResponse<Result> {
pub jsonrpc: JsonRpcVersion,
pub id: String,
pub result: Result,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct JsonRpcErrorResponse {
pub jsonrpc: JsonRpcVersion,
pub id: String,
pub error: JsonRpcError,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct JsonRpcError {
pub code: i32,
pub message: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<Value>,
}
pub const METHOD_NOT_FOUND: i32 = -32601;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct RawWireMessage {
pub jsonrpc: JsonRpcVersion,
pub id: Option<String>,
pub method: Option<String>,
pub params: Option<Value>,
pub result: Option<Value>,
pub error: Option<JsonRpcError>,
}