vv_agent/app_server/protocol/
jsonrpc.rs1use schemars::JsonSchema;
2use serde::{Deserialize, Serialize};
3use serde_json::Value;
4use ts_rs::TS;
5
6use super::errors::AppServerErrorCode;
7
8#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema, TS)]
9#[serde(untagged)]
10pub enum RequestId {
11 String(String),
12 Integer(i64),
13}
14
15#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, TS)]
16#[serde(untagged)]
17pub enum JsonRpcMessage {
18 Request(JsonRpcRequest),
19 Notification(JsonRpcNotification),
20 Response(JsonRpcResponse),
21 Error(JsonRpcError),
22}
23
24#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, TS)]
25pub struct JsonRpcRequest {
26 pub id: RequestId,
27 pub method: String,
28 #[serde(default, skip_serializing_if = "Option::is_none")]
29 pub params: Option<Value>,
30}
31
32#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, TS)]
33pub struct JsonRpcNotification {
34 pub method: String,
35 #[serde(default, skip_serializing_if = "Option::is_none")]
36 pub params: Option<Value>,
37}
38
39#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, TS)]
40pub struct JsonRpcResponse {
41 pub id: RequestId,
42 pub result: Value,
43}
44
45#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, TS)]
46pub struct JsonRpcError {
47 pub id: RequestId,
48 pub error: JsonRpcErrorBody,
49}
50
51#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, TS)]
52pub struct JsonRpcErrorBody {
53 pub code: i64,
54 pub message: String,
55 #[serde(default, skip_serializing_if = "Option::is_none")]
56 pub data: Option<Value>,
57}
58
59impl JsonRpcError {
60 pub fn new(id: RequestId, code: AppServerErrorCode, message: impl Into<String>) -> Self {
61 Self {
62 id,
63 error: JsonRpcErrorBody {
64 code: code.code(),
65 message: message.into(),
66 data: None,
67 },
68 }
69 }
70
71 pub fn with_data(mut self, data: Value) -> Self {
72 self.error.data = Some(data);
73 self
74 }
75}