lsp_server_tokio/
error.rs1use serde::{Deserialize, Serialize};
7use serde_json::Value;
8
9#[derive(Debug, Clone, Copy, PartialEq, Eq)]
20#[repr(i32)]
21pub enum ErrorCode {
22 ParseError = -32700,
25 InvalidRequest = -32600,
27 MethodNotFound = -32601,
29 InvalidParams = -32602,
31 InternalError = -32603,
33
34 ServerNotInitialized = -32002,
37 UnknownErrorCode = -32001,
39
40 RequestFailed = -32803,
43 ServerCancelled = -32802,
45 ContentModified = -32801,
47 RequestCancelled = -32800,
49}
50
51impl From<ErrorCode> for i32 {
52 fn from(code: ErrorCode) -> Self {
53 code as i32
54 }
55}
56
57impl TryFrom<i32> for ErrorCode {
58 type Error = i32;
59
60 fn try_from(code: i32) -> Result<Self, Self::Error> {
64 match code {
65 -32700 => Ok(ErrorCode::ParseError),
66 -32600 => Ok(ErrorCode::InvalidRequest),
67 -32601 => Ok(ErrorCode::MethodNotFound),
68 -32602 => Ok(ErrorCode::InvalidParams),
69 -32603 => Ok(ErrorCode::InternalError),
70 -32002 => Ok(ErrorCode::ServerNotInitialized),
71 -32001 => Ok(ErrorCode::UnknownErrorCode),
72 -32803 => Ok(ErrorCode::RequestFailed),
73 -32802 => Ok(ErrorCode::ServerCancelled),
74 -32801 => Ok(ErrorCode::ContentModified),
75 -32800 => Ok(ErrorCode::RequestCancelled),
76 _ => Err(code),
77 }
78 }
79}
80
81#[derive(Debug, Clone, Serialize, Deserialize)]
100pub struct ResponseError {
101 pub code: i32,
103 pub message: String,
105 #[serde(skip_serializing_if = "Option::is_none")]
108 pub data: Option<Value>,
109}
110
111impl ResponseError {
112 pub fn new(code: ErrorCode, message: impl Into<String>) -> Self {
116 Self {
117 code: code as i32,
118 message: message.into(),
119 data: None,
120 }
121 }
122
123 pub fn new_raw(code: i32, message: impl Into<String>) -> Self {
127 Self {
128 code,
129 message: message.into(),
130 data: None,
131 }
132 }
133
134 #[must_use]
138 pub fn with_data(mut self, data: Value) -> Self {
139 self.data = Some(data);
140 self
141 }
142
143 #[must_use]
145 pub fn error_code(&self) -> Option<ErrorCode> {
146 ErrorCode::try_from(self.code).ok()
147 }
148}
149
150#[cfg(test)]
151mod tests {
152 use super::*;
153
154 #[test]
155 fn error_code_to_i32() {
156 assert_eq!(i32::from(ErrorCode::ParseError), -32700);
157 assert_eq!(i32::from(ErrorCode::InvalidRequest), -32600);
158 assert_eq!(i32::from(ErrorCode::MethodNotFound), -32601);
159 assert_eq!(i32::from(ErrorCode::InvalidParams), -32602);
160 assert_eq!(i32::from(ErrorCode::InternalError), -32603);
161 assert_eq!(i32::from(ErrorCode::ServerNotInitialized), -32002);
162 assert_eq!(i32::from(ErrorCode::UnknownErrorCode), -32001);
163 assert_eq!(i32::from(ErrorCode::RequestFailed), -32803);
164 assert_eq!(i32::from(ErrorCode::ServerCancelled), -32802);
165 assert_eq!(i32::from(ErrorCode::ContentModified), -32801);
166 assert_eq!(i32::from(ErrorCode::RequestCancelled), -32800);
167 }
168
169 #[test]
170 fn i32_to_error_code() {
171 assert_eq!(ErrorCode::try_from(-32700), Ok(ErrorCode::ParseError));
172 assert_eq!(ErrorCode::try_from(-32601), Ok(ErrorCode::MethodNotFound));
173 assert_eq!(ErrorCode::try_from(-32800), Ok(ErrorCode::RequestCancelled));
174 assert_eq!(ErrorCode::try_from(-99999), Err(-99999));
175 }
176
177 #[test]
178 fn response_error_construction() {
179 let error = ResponseError::new(ErrorCode::MethodNotFound, "Method not found");
180 assert_eq!(error.code, -32601);
181 assert_eq!(error.message, "Method not found");
182 assert!(error.data.is_none());
183 }
184
185 #[test]
186 fn response_error_with_data() {
187 let error = ResponseError::new(ErrorCode::InvalidParams, "Invalid params")
188 .with_data(serde_json::json!({"field": "uri"}));
189 assert_eq!(error.code, -32602);
190 assert!(error.data.is_some());
191 assert_eq!(error.data.unwrap()["field"], "uri");
192 }
193
194 #[test]
195 fn response_error_serialization_without_data() {
196 let error = ResponseError::new(ErrorCode::ParseError, "Parse error");
197 let json = serde_json::to_string(&error).unwrap();
198 assert!(!json.contains("data"));
200 assert!(json.contains("-32700"));
201 assert!(json.contains("Parse error"));
202 }
203
204 #[test]
205 fn response_error_serialization_with_data() {
206 let error = ResponseError::new(ErrorCode::InvalidParams, "Missing field")
207 .with_data(serde_json::json!({"missing": "uri"}));
208 let json = serde_json::to_string(&error).unwrap();
209 assert!(json.contains("data"));
210 assert!(json.contains("missing"));
211 }
212
213 #[test]
214 fn response_error_deserialization() {
215 let json = r#"{"code":-32601,"message":"Method not found"}"#;
216 let error: ResponseError = serde_json::from_str(json).unwrap();
217 assert_eq!(error.code, -32601);
218 assert_eq!(error.message, "Method not found");
219 assert!(error.data.is_none());
220 }
221
222 #[test]
223 fn response_error_deserialization_with_data() {
224 let json = r#"{"code":-32602,"message":"Invalid","data":{"field":"uri"}}"#;
225 let error: ResponseError = serde_json::from_str(json).unwrap();
226 assert_eq!(error.code, -32602);
227 assert!(error.data.is_some());
228 }
229
230 #[test]
231 fn response_error_raw_code() {
232 let error = ResponseError::new_raw(-99999, "Custom error");
233 assert_eq!(error.code, -99999);
234 assert!(error.error_code().is_none());
235 }
236
237 #[test]
238 fn skip_serializing_if_works() {
239 let error = ResponseError::new(ErrorCode::InternalError, "Error");
240 let json = serde_json::to_value(&error).unwrap();
241 let obj = json.as_object().unwrap();
242 assert!(!obj.contains_key("data"));
244 }
245}