lsp_primitives/
no_params.rs1use crate::lsps0::parameter_validation::ExpectedFields;
2use serde::{
3 de::{Deserializer, Visitor},
4 ser::{SerializeMap, Serializer},
5 Deserialize, Serialize,
6};
7
8#[derive(Debug, Default, Clone, PartialEq)]
13pub struct NoParams;
14
15impl Serialize for NoParams {
18 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
19 where
20 S: Serializer,
21 {
22 serializer.serialize_map(Some(0))?.end()
23 }
24}
25
26impl<'de> Visitor<'de> for NoParams {
27 type Value = NoParams;
28
29 fn expecting(&self, fmt: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
30 write!(fmt, "Expected NoParams to be serialized as '{{}}'")
31 }
32
33 fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
34 where
35 A: serde::de::MapAccess<'de>,
36 {
37 let maybe_entry = map.next_entry::<String, String>()?;
38 match maybe_entry {
39 Some(_) => Err(serde::de::Error::custom("Expected NoParams")),
40 None => Ok(NoParams),
41 }
42 }
43
44 fn visit_unit<E>(self) -> Result<Self::Value, E>
45 where
46 E: serde::de::Error,
47 {
48 Ok(NoParams)
49 }
50
51 fn visit_none<E>(self) -> Result<Self::Value, E> {
52 Ok(NoParams)
53 }
54}
55
56impl<'de> Deserialize<'de> for NoParams {
57 fn deserialize<D>(deserializer: D) -> Result<NoParams, D::Error>
58 where
59 D: Deserializer<'de>,
60 {
61 deserializer.deserialize_any(NoParams)
62 }
63}
64
65impl ExpectedFields for NoParams {
66 fn expected_fields() -> Vec<String> {
67 vec![]
68 }
69}
70
71#[cfg(test)]
72mod test {
73 use super::*;
74
75 #[test]
76 fn serialize_no_params() {
77 let no_params = NoParams;
78 let json_str = serde_json::to_string(&no_params).unwrap();
79
80 assert_eq!(json_str, "{}")
81 }
82
83 #[test]
84 fn deserialize_no_params() {
85 let _: NoParams = serde_json::from_str("{}").unwrap();
86 let _: NoParams = serde_json::from_str("null").unwrap();
87 let _: NoParams = serde_json::from_value(serde_json::Value::Null).unwrap();
88 }
89}