chan_rs/lsp.rs
1pub(crate) mod io;
2pub(crate) mod listener;
3pub mod process;
4use std::time::Duration;
5
6pub use lsp_types;
7pub(crate) mod utils;
8use serde::{Deserialize, Serialize};
9use serde_json::{value::RawValue, Value};
10
11/// The base Language Server Protocol consists of content part and header part
12/// Header have 2 fields: Content-Length and Content-Type( Optional)
13/// Header part is ascii encoded
14/// Header and content part is seperated by \r\n\r\n
15
16// The version used by most Language server is 2.0
17pub const JSON_RPC_VERSION: &str = "2.0";
18
19// Content length header
20pub(crate) const CONTENT_LEN_HEADER: &str = "Content-Length: ";
21
22// Header and content seperator
23pub(crate) const HEADER_DELIMITER: &[u8; 4] = b"\r\n\r\n";
24
25pub(crate) const LSP_REQUEST_TIMEOUT: Duration = Duration::from_secs(5);
26
27/// Implemetation of LSP Request Id
28/// [See](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#requestMessage)
29#[derive(Debug, Clone, Deserialize, Serialize, Eq, PartialEq, Hash)]
30#[serde(untagged)]
31pub enum RequestId {
32 Int(i32),
33 Str(String),
34}
35
36/// Implemetation of LSP Request Message
37/// [Request Message](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#requestMessage)
38///
39/// * `jsonrpc`: jsonrpc version, see [JSON_RPC_VERSION]
40/// * `id`: Request id, either integer or string
41/// * `method`: Request method
42/// * `params`: Request params
43#[derive(Debug, Serialize, Clone)]
44pub struct LSPRequest<'a, T> {
45 pub jsonrpc: &'static str,
46 pub id: RequestId,
47 pub method: &'a str,
48 pub params: T,
49}
50
51/// Implementation of LSP Notification Message
52/// [Notification Message](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#notificationMessage)
53///
54/// * `jsonrpc`: jsonrpc version, see [JSON_RPC_VERSION]
55/// * `method`: Notification Method
56/// * `params`: Notification Parameters
57#[derive(Debug, Serialize, Clone)]
58pub struct LSPNotification<'a, T> {
59 pub jsonrpc: &'static str,
60 pub method: &'a str,
61 pub params: T,
62}
63
64/// Implementation of LSPResponse message
65/// [Response Message](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#responseMessage)
66/// The response message required that result and error field can't be present on one message
67///
68/// * `jsonrpc`: jsonrpc version, see [JSON_RPC_VERSION]
69/// * `id`: Request Id, see [RequestId]
70/// * `value`: See [LSPResult]
71#[derive(Debug, Deserialize, Serialize, Clone)]
72pub struct LSPResponse<'a, T> {
73 pub jsonrpc: &'a str,
74 pub id: RequestId,
75 #[serde(flatten)]
76 pub value: LSPResult<T>,
77}
78
79// Result of response message
80/// [Response Message](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#responseMessage)
81#[derive(Debug, Deserialize, Serialize, Clone)]
82pub enum LSPResult<T> {
83 #[serde(rename = "result")]
84 Ok(Option<T>),
85 #[serde(rename = "error")]
86 Err(Option<LSPError>),
87}
88
89/// Implementation of Response Error
90/// [Response Error](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#responseError)
91///
92/// * `message`: Error message
93/// * `code`: Error code
94/// * `data`: LSPAny
95#[derive(Debug, Deserialize, Serialize, Clone)]
96pub struct LSPError {
97 pub message: String,
98 pub code: i32,
99 pub data: Option<Value>,
100}
101
102/// Serialize any response we got back from the server
103///
104/// * `jsonrpc`: jsonrpc version, see [JSON_RPC_VERSION]
105/// * `id`: Request Id, see [RequestId]
106/// * `result`: response result field
107/// * `error`: response error field
108#[derive(Debug, Deserialize, Serialize, Clone)]
109pub(crate) struct AnyResponse<'a> {
110 pub(crate) jsonrpc: &'a str,
111 pub(crate) id: RequestId,
112 #[serde(borrow)]
113 pub(crate) result: Option<&'a RawValue>,
114 #[serde(default)]
115 pub(crate) error: Option<LSPError>,
116}
117
118#[derive(Debug, Deserialize, Serialize, Clone)]
119pub(crate) struct AnyNotification {
120 pub(crate) method: String,
121 #[serde(default)]
122 pub(crate) id: Option<RequestId>,
123 #[serde(default)]
124 pub(crate) params: Option<Value>,
125}
126
127#[derive(Debug, Clone, Copy)]
128pub enum IOKind {
129 In,
130 Out,
131 Err,
132}