starknet_devnet_server/api/
serde_helpers.rs1pub 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}