Skip to main content

voirs_cli/lsp/
protocol.rs

1//! LSP protocol message handling
2
3use serde::{Deserialize, Serialize};
4
5/// LSP request message
6#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct RequestMessage {
8    /// Protocol version
9    pub jsonrpc: String,
10
11    /// Request ID
12    pub id: i64,
13
14    /// Method name
15    pub method: String,
16
17    /// Optional parameters
18    #[serde(skip_serializing_if = "Option::is_none")]
19    pub params: Option<serde_json::Value>,
20}
21
22/// LSP response message
23#[derive(Debug, Clone, Serialize, Deserialize)]
24pub struct ResponseMessage {
25    /// Protocol version
26    pub jsonrpc: String,
27
28    /// Request ID
29    pub id: i64,
30
31    /// Result
32    #[serde(skip_serializing_if = "Option::is_none")]
33    pub result: Option<serde_json::Value>,
34
35    /// Error
36    #[serde(skip_serializing_if = "Option::is_none")]
37    pub error: Option<ResponseError>,
38}
39
40/// LSP notification message
41#[derive(Debug, Clone, Serialize, Deserialize)]
42pub struct NotificationMessage {
43    /// Protocol version
44    pub jsonrpc: String,
45
46    /// Method name
47    pub method: String,
48
49    /// Optional parameters
50    #[serde(skip_serializing_if = "Option::is_none")]
51    pub params: Option<serde_json::Value>,
52}
53
54/// LSP response error
55#[derive(Debug, Clone, Serialize, Deserialize)]
56pub struct ResponseError {
57    /// Error code
58    pub code: i32,
59
60    /// Error message
61    pub message: String,
62
63    /// Additional error data
64    #[serde(skip_serializing_if = "Option::is_none")]
65    pub data: Option<serde_json::Value>,
66}
67
68#[cfg(test)]
69mod tests {
70    use super::*;
71
72    #[test]
73    fn test_request_message_serialization() {
74        let request = RequestMessage {
75            jsonrpc: "2.0".to_string(),
76            id: 1,
77            method: "initialize".to_string(),
78            params: None,
79        };
80
81        let json = serde_json::to_string(&request).unwrap();
82        assert!(json.contains("\"jsonrpc\":\"2.0\""));
83        assert!(json.contains("\"method\":\"initialize\""));
84    }
85
86    #[test]
87    fn test_response_message_serialization() {
88        let response = ResponseMessage {
89            jsonrpc: "2.0".to_string(),
90            id: 1,
91            result: Some(serde_json::json!({"status": "ok"})),
92            error: None,
93        };
94
95        let json = serde_json::to_string(&response).unwrap();
96        assert!(json.contains("\"result\""));
97    }
98}