1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3
4#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct JsonRpcRequest {
6 pub jsonrpc: String,
7 pub method: String,
8 pub params: Option<Value>,
9 pub id: Option<Value>,
10}
11
12#[derive(Debug, Clone, Serialize, Deserialize)]
13pub struct JsonRpcResponse {
14 pub jsonrpc: String,
15 #[serde(skip_serializing_if = "Option::is_none")]
16 pub result: Option<Value>,
17 #[serde(skip_serializing_if = "Option::is_none")]
18 pub error: Option<JsonRpcError>,
19 pub id: Option<Value>,
20}
21
22#[derive(Debug, Clone, Serialize, Deserialize)]
23pub struct JsonRpcError {
24 pub code: i64,
25 pub message: String,
26 #[serde(skip_serializing_if = "Option::is_none")]
27 pub data: Option<Value>,
28}
29
30impl JsonRpcResponse {
31 pub fn success(id: Option<Value>, result: Value) -> Self {
32 Self {
33 jsonrpc: "2.0".into(),
34 result: Some(result),
35 error: None,
36 id,
37 }
38 }
39
40 pub fn error(id: Option<Value>, code: i64, message: String) -> Self {
41 Self {
42 jsonrpc: "2.0".into(),
43 result: None,
44 error: Some(JsonRpcError { code, message, data: None }),
45 id,
46 }
47 }
48}
49
50#[cfg(test)]
51mod tests {
52 use super::*;
53 use serde_json::json;
54
55 #[test]
56 fn test_request_serde() {
57 let req = JsonRpcRequest {
58 jsonrpc: "2.0".to_string(),
59 method: "create_entities".to_string(),
60 params: Some(json!({"entities": []})),
61 id: Some(Value::Number(1.into())),
62 };
63 let json = serde_json::to_string(&req).unwrap();
64 let deserialized: JsonRpcRequest = serde_json::from_str(&json).unwrap();
65 assert_eq!(deserialized.method, "create_entities");
66 }
67
68 #[test]
69 fn test_response_success() {
70 let resp = JsonRpcResponse::success(Some(Value::Number(1.into())), json!({"content": "hello"}));
71 assert_eq!(resp.jsonrpc, "2.0");
72 assert!(resp.result.is_some());
73 assert!(resp.error.is_none());
74 }
75
76 #[test]
77 fn test_response_error() {
78 let resp = JsonRpcResponse::error(Some(Value::Number(1.into())), -32602, "Invalid params".into());
79 assert!(resp.result.is_none());
80 let err = resp.error.unwrap();
81 assert_eq!(err.code, -32602);
82 }
83}