use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct JsonRpcError {
pub code: i32,
pub message: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum JsonRpcMessage {
Request {
jsonrpc: String,
id: serde_json::Value,
method: String,
#[serde(skip_serializing_if = "Option::is_none")]
params: Option<serde_json::Value>,
},
Response {
jsonrpc: String,
id: serde_json::Value,
#[serde(skip_serializing_if = "Option::is_none")]
result: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
error: Option<JsonRpcError>,
},
Notification {
jsonrpc: String,
method: String,
#[serde(skip_serializing_if = "Option::is_none")]
params: Option<serde_json::Value>,
},
}
impl JsonRpcMessage {
pub fn request(id: serde_json::Value, method: &str, params: Option<serde_json::Value>) -> Self {
JsonRpcMessage::Request {
jsonrpc: "2.0".to_string(),
id,
method: method.to_string(),
params,
}
}
pub fn response(id: serde_json::Value, result: serde_json::Value) -> Self {
JsonRpcMessage::Response {
jsonrpc: "2.0".to_string(),
id,
result: Some(result),
error: None,
}
}
pub fn error(id: serde_json::Value, code: i32, message: &str, data: Option<serde_json::Value>) -> Self {
JsonRpcMessage::Response {
jsonrpc: "2.0".to_string(),
id,
result: None,
error: Some(JsonRpcError {
code,
message: message.to_string(),
data,
}),
}
}
pub fn notification(method: &str, params: Option<serde_json::Value>) -> Self {
JsonRpcMessage::Notification {
jsonrpc: "2.0".to_string(),
method: method.to_string(),
params,
}
}
}