csskit_lsp/jsonrpc/
request.rs

1use serde::{Deserialize, Serialize};
2use serde_json::{Value, to_value};
3
4use super::Id;
5
6/// A request message to describe a request between the client and the server. Every processed request must send a response back to the sender of the request.
7///
8/// As defined in [JSON-RPC](https://www.jsonrpc.org/specification#request_object) and [LSP](https://microsoft.github.io/language-server-protocol/specifications/specification-3-16/#requestMessage).
9#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
10pub struct Request {
11	pub id: Id,
12	pub method: String,
13	#[serde(default = "serde_json::Value::default", skip_serializing_if = "serde_json::Value::is_null")]
14	pub params: Value,
15}
16
17impl Request {
18	pub fn new<T>(id: Id, params: T::Params) -> Request
19	where
20		T: lsp_types::request::Request,
21	{
22		Request { id, method: T::METHOD.into(), params: to_value(params).unwrap() }
23	}
24}
25
26#[cfg(test)]
27mod tests {
28	use lsp_types::request::{Initialize, Request as RequestTrait};
29
30	use super::*;
31
32	#[test]
33	fn test_request_deserialize() {
34		assert_eq!(
35			serde_json::from_str::<Request>(r#"{"id":0, "method": "initialize", "params": null}"#).unwrap(),
36			Request { id: 0.into(), params: Value::Null, method: Initialize::METHOD.into() }
37		);
38	}
39}