lsp_primitives/
no_params.rs

1use crate::lsps0::parameter_validation::ExpectedFields;
2use serde::{
3    de::{Deserializer, Visitor},
4    ser::{SerializeMap, Serializer},
5    Deserialize, Serialize,
6};
7
8// LSPS0 specifies that the RPC-request must use a parameter-by-name structure.
9//
10// A JSONRpcRequest<(),()> will be serialized to a json where "params" : null
11// A JsonRpcRequest<NoParams, ()> will be serialized to "params" : {} which is compliant
12#[derive(Debug, Default, Clone, PartialEq)]
13pub struct NoParams;
14
15// Serde serializes NoParams to null by default
16// LSPS0 requires an empty dictionary in this situation
17impl 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}