Skip to main content

codex_app_server_protocol/
jsonrpc_lite.rs

1//! We do not do true JSON-RPC 2.0, as we neither send nor expect the
2//! "jsonrpc": "2.0" field.
3
4use schemars::JsonSchema;
5use serde::Deserialize;
6use serde::Serialize;
7use ts_rs::TS;
8
9pub const JSONRPC_VERSION: &str = "2.0";
10
11#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, Hash, Eq, JsonSchema, TS)]
12#[serde(untagged)]
13pub enum RequestId {
14    String(String),
15    #[ts(type = "number")]
16    Integer(i64),
17}
18
19pub type Result = serde_json::Value;
20
21/// Refers to any valid JSON-RPC object that can be decoded off the wire, or encoded to be sent.
22#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema, TS)]
23#[serde(untagged)]
24pub enum JSONRPCMessage {
25    Request(JSONRPCRequest),
26    Notification(JSONRPCNotification),
27    Response(JSONRPCResponse),
28    Error(JSONRPCError),
29}
30
31/// A request that expects a response.
32#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema, TS)]
33pub struct JSONRPCRequest {
34    pub id: RequestId,
35    pub method: String,
36    #[serde(default, skip_serializing_if = "Option::is_none")]
37    #[ts(optional)]
38    pub params: Option<serde_json::Value>,
39}
40
41/// A notification which does not expect a response.
42#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema, TS)]
43pub struct JSONRPCNotification {
44    pub method: String,
45    #[serde(default, skip_serializing_if = "Option::is_none")]
46    #[ts(optional)]
47    pub params: Option<serde_json::Value>,
48}
49
50/// A successful (non-error) response to a request.
51#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema, TS)]
52pub struct JSONRPCResponse {
53    pub id: RequestId,
54    pub result: Result,
55}
56
57/// A response to a request that indicates an error occurred.
58#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema, TS)]
59pub struct JSONRPCError {
60    pub error: JSONRPCErrorError,
61    pub id: RequestId,
62}
63
64#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema, TS)]
65pub struct JSONRPCErrorError {
66    pub code: i64,
67    #[serde(default, skip_serializing_if = "Option::is_none")]
68    #[ts(optional)]
69    pub data: Option<serde_json::Value>,
70    pub message: String,
71}