starknet_devnet_server/api/
serde_helpers.rs

1/// A module that deserializes `[]` and `{}` optionally
2pub mod empty_params {
3    use serde::de::Error as DeError;
4    use serde::{Deserialize, Deserializer};
5    use serde_json::Value;
6
7    pub fn deserialize<'de, D>(d: D) -> Result<(), D::Error>
8    where
9        D: Deserializer<'de>,
10    {
11        let value: Value = Deserialize::deserialize(d)?;
12
13        match value {
14            Value::Null => Ok(()),
15            Value::Object(obj) if obj.is_empty() => Ok(()),
16            Value::Array(arr) if arr.is_empty() => Ok(()),
17            other => Err(DeError::custom(format!(
18                "expected empty object or array for params; got: {other:?}"
19            ))),
20        }
21    }
22}
23
24pub mod optional_params {
25    use serde::de::{DeserializeOwned, Error as DeError};
26    use serde::{Deserialize, Deserializer};
27    use serde_json::Value;
28
29    pub fn deserialize<'de, D, T>(d: D) -> Result<Option<T>, D::Error>
30    where
31        D: Deserializer<'de>,
32        T: DeserializeOwned,
33    {
34        let value: Value = Deserialize::deserialize(d)?;
35
36        match value {
37            Value::Null => Ok(None),
38            Value::Object(obj) if obj.is_empty() => Ok(None),
39            Value::Array(arr) if arr.is_empty() => Ok(None),
40            other => Ok(Some(serde_json::from_value(other).map_err(DeError::custom)?)),
41        }
42    }
43}
44
45#[cfg(test)]
46mod tests {
47    use serde::de::IntoDeserializer;
48    use serde_json::{self, Value};
49
50    use super::empty_params::deserialize;
51    use super::optional_params;
52
53    fn test_deserialization(json_str: &str) -> Result<(), serde_json::Error> {
54        let value: Value = serde_json::from_str(json_str)?;
55        let deserializer = value.into_deserializer();
56        deserialize(deserializer)
57    }
58
59    #[test]
60    fn deserialize_empty_object() {
61        let json_str = "{}";
62        assert!(test_deserialization(json_str).is_ok());
63    }
64
65    #[test]
66    fn deserialize_empty_array() {
67        let json_str = "[]";
68        assert!(test_deserialization(json_str).is_ok());
69    }
70
71    #[test]
72    fn deserialize_non_empty_object() {
73        let json_str = "{\"key\": \"value\"}";
74        assert!(test_deserialization(json_str).is_err());
75    }
76
77    #[test]
78    fn deserialize_non_empty_array() {
79        let json_str = "[1, 2, 3]";
80        assert!(test_deserialization(json_str).is_err());
81    }
82
83    #[test]
84    fn deserialize_other_types() {
85        let json_str = "\"string\"";
86        assert!(test_deserialization(json_str).is_err());
87    }
88
89    #[test]
90    fn deserialize_null() {
91        let value: Value = serde_json::Value::Null;
92        let deserializer = value.into_deserializer();
93        assert!(deserialize(deserializer).is_ok());
94    }
95    #[test]
96    fn deserialize_to_empty_object_or_with_some_data() {
97        let json_str = "[1, 2, 3]";
98        let value: Value = serde_json::from_str(json_str).unwrap();
99        let deserializer = value.into_deserializer();
100        let arr: Option<Vec<u32>> = optional_params::deserialize(deserializer).unwrap();
101        assert_eq!(arr, Some(vec![1, 2, 3]));
102        let empty_field: Option<()> =
103            optional_params::deserialize(Value::Null.into_deserializer()).unwrap();
104        assert!(empty_field.is_none());
105    }
106}