sync_lsp/connection/jsonrpc/
message.rs1use serde_repr::{Deserialize_repr, Serialize_repr};
2use std::fmt::{Formatter, Result as FmtResult};
3use serde::de::{Visitor, MapAccess, Deserializer, Error as SerdeError};
4use serde::{Serialize, Deserialize};
5use serde_json::Value;
6
7#[derive(Serialize, Deserialize, Debug, Clone, Hash, PartialEq, Eq)]
8#[serde(untagged)]
9pub(crate) enum MessageID {
10 Integer(u64),
11 String(String),
12 Null
13}
14
15#[derive(Deserialize, Serialize)]
16pub(crate) struct CancelParams {
17 pub(crate) id: MessageID
18}
19
20#[derive(Serialize, Deserialize, Debug)]
21pub(crate) struct EmptyParams {
22
23}
24
25#[derive(Serialize, Deserialize, Debug)]
26pub(super) enum Version {
27 #[serde(rename = "2.0")]
28 Current
29}
30
31#[derive(Deserialize, Serialize, Debug)]
32pub(crate) struct Error {
33 pub code: ErrorCode,
34 pub message: String,
35 }
37
38#[repr(i32)]
40#[derive(Serialize_repr, Deserialize_repr, Debug, PartialEq)]
41pub enum ErrorCode {
42 UnknownProtocolVersion = 1,
44
45 ParseError = -32700,
47 InvalidRequest = -32600,
48 MethodNotFound = -32601,
49 InvalidParams = -32602,
50 InternalError = -32603,
51
52 ServerNotInitialized =-32002,
53 #[serde(other)]
54 UnknownErrorCode = -32001,
55 RequestFailed = -32803,
56 ServerCancelled = -32802,
57 ContentModified = -32801,
58 RequestCancelled = -32800,
59}
60
61#[derive(Serialize, Debug)]
62#[serde(untagged)]
63pub(super) enum Message {
64 Request {
65 jsonrpc: Version,
66 id: MessageID,
67 method: String,
68 params: Value
69 },
70 Notification {
71 jsonrpc: Version,
72 method: String,
73 params: Value
74 },
75 Response {
76 jsonrpc: Version,
77 id: MessageID,
78 result: Value
79 },
80 Error {
81 jsonrpc: Version,
82 id: MessageID,
83 error: Error
84 }
85}
86
87struct MessageVisitor;
88
89#[derive(Deserialize)]
90#[serde(field_identifier, rename_all = "camelCase")]
91enum MessageField {
92 Jsonrpc,
93 Id,
94 Method,
95 Params,
96 Result,
97 Error
98}
99
100impl<'a> Deserialize<'a> for Message where {
101 fn deserialize<D: Deserializer<'a>>(deserializer: D) -> Result<Self, D::Error> {
102 deserializer.deserialize_map(MessageVisitor)
103 }
104}
105
106impl<'a> Visitor<'a> for MessageVisitor {
107 type Value = Message;
108
109 fn expecting(&self, formatter: &mut Formatter) -> FmtResult {
110 formatter.write_str("Hello world")
111 }
112
113 fn visit_map<A: MapAccess<'a>>(self, mut map: A) -> Result<Self::Value, A::Error> {
114
115 let mut jsonrpc = None::<Version>;
116 let mut id = None::<MessageID>;
117 let mut method = None::<String>;
118 let mut params = None::<Value>;
119 let mut result = None::<Value>;
120 let mut error = None::<Error>;
121
122 while let Some(key) = map.next_key()? {
123 match key {
124 MessageField::Jsonrpc => {
125 if jsonrpc.is_some() {
126 return Err(SerdeError::duplicate_field("jsonrpc"))
127 }
128 jsonrpc = Some(map.next_value()?);
129 },
130 MessageField::Id => {
131 if id.is_some() {
132 return Err(SerdeError::duplicate_field("id"))
133 }
134 id = Some(map.next_value()?);
135 },
136 MessageField::Method => {
137 if method.is_some() {
138 return Err(SerdeError::duplicate_field("method"))
139 }
140 method = Some(map.next_value()?)
141 }
142 MessageField::Params => {
143 if params.is_some() {
144 return Err(SerdeError::duplicate_field("params"))
145 }
146 params = Some(map.next_value()?)
147 }
148 MessageField::Result => {
149 if result.is_some() {
150 return Err(SerdeError::duplicate_field("result"))
151 }
152 result = Some(map.next_value()?)
153 }
154 MessageField::Error => {
155 if error.is_some() {
156 return Err(SerdeError::duplicate_field("error"))
157 }
158 error = Some(map.next_value()?)
159 }
160 }
161 }
162
163 let Some(jsonrpc) = jsonrpc else {
164 return Err(SerdeError::missing_field("jsonrpc"))
165 };
166
167 if let Some(params) = params {
168 let fields = &["jsonrpc", "id", "method", "params"];
169
170 let Some(method) = method else { return Err(SerdeError::missing_field("method")) };
171 if error.is_some() { return Err(SerdeError::unknown_field("error", fields)) }
172 if result.is_some() { return Err(SerdeError::unknown_field("result", fields)) }
173
174 if let Some(id) = id {
175 return Ok(Message::Request { jsonrpc, id, method, params })
176 } else {
177 return Ok(Message::Notification { jsonrpc, method, params })
178 }
179 }
180
181 if let Some(result) = result {
182 let fields = &["jsonrpc", "id", "result"];
183
184 let Some(id) = id else { return Err(SerdeError::missing_field("id")) };
185 if error.is_some() { return Err(SerdeError::unknown_field("error", fields)) }
186 if params.is_some() { return Err(SerdeError::unknown_field("params", fields)) }
187 if method.is_some() { return Err(SerdeError::unknown_field("method", fields)) }
188
189 return Ok(Message::Response { jsonrpc, id, result })
190 }
191
192 if let Some(error) = error {
193 let fields = &["jsonrpc", "id", "error"];
194
195 let Some(id) = id else { return Err(SerdeError::missing_field("id")) };
196 if result.is_some() { return Err(SerdeError::unknown_field("result", fields)) }
197 if params.is_some() { return Err(SerdeError::unknown_field("params", fields)) }
198 if method.is_some() { return Err(SerdeError::unknown_field("method", fields)) }
199
200 return Ok(Message::Error { jsonrpc, id, error })
201 }
202
203 Err(SerdeError::unknown_variant("unknown", &["notification" ,"request", "result", "error"]))
204 }
205}