use serde::{Deserialize, Deserializer, Serialize};
fn double_option<'de, D>(de: D) -> Result<Option<Option<serde_json::Value>>, D::Error>
where
D: Deserializer<'de>,
{
serde::Deserialize::deserialize(de).map(Some)
}
#[derive(Serialize, Deserialize, Debug)]
pub(super) struct JsonRpcRequest {
#[serde(default)]
pub(super) jsonrpc: String,
pub(super) method: String,
pub(super) params: Option<serde_json::Value>,
#[serde(default, deserialize_with = "double_option")]
pub(super) id: Option<Option<serde_json::Value>>,
}
#[derive(Serialize, Deserialize, Debug)]
pub(super) struct JsonRpcResponse {
pub(super) jsonrpc: String,
pub(super) result: Option<serde_json::Value>,
pub(super) error: Option<JsonRpcError>,
pub(super) id: Option<serde_json::Value>,
}
impl JsonRpcResponse {
pub(super) fn parse_error() -> Self {
Self {
jsonrpc: "2.0".to_string(),
result: None,
error: Some(JsonRpcError {
code: -32700,
message: "Parse error".to_string(),
}),
id: Some(serde_json::Value::Null),
}
}
pub(super) fn request_timeout(id: Option<serde_json::Value>, seconds: u64) -> Self {
Self {
jsonrpc: "2.0".to_string(),
result: None,
error: Some(JsonRpcError {
code: -32000,
message: format!("request exceeded the maximum duration of {seconds}s"),
}),
id,
}
}
}
#[derive(Serialize, Deserialize, Debug)]
pub(super) struct JsonRpcError {
pub(super) code: i32,
pub(super) message: String,
}