Skip to main content

vv_agent/app_server/protocol/
jsonrpc.rs

1use 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}