openzeppelin_relayer/utils/serde/
u128_deserializer.rs1use std::fmt;
6
7use serde::{de, Deserialize, Deserializer, Serializer};
8
9use super::deserialize_u64;
10
11#[derive(Debug)]
12struct U128Visitor;
13
14impl de::Visitor<'_> for U128Visitor {
15 type Value = u128;
16
17 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
18 formatter.write_str("a string containing a u128 number or a u128 integer")
19 }
20
21 fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
23 where
24 E: de::Error,
25 {
26 value.parse::<u128>().map_err(de::Error::custom)
27 }
28
29 fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E>
31 where
32 E: de::Error,
33 {
34 Ok(value as u128)
35 }
36
37 fn visit_i64<E>(self, value: i64) -> Result<Self::Value, E>
39 where
40 E: de::Error,
41 {
42 if value < 0 {
43 Err(de::Error::custom(
44 "negative value cannot be converted to u128",
45 ))
46 } else {
47 Ok(value as u128)
48 }
49 }
50}
51
52pub fn deserialize_u128<'de, D>(deserializer: D) -> Result<u128, D::Error>
53where
54 D: Deserializer<'de>,
55{
56 deserializer.deserialize_any(U128Visitor)
57}
58
59pub fn deserialize_optional_u128<'de, D>(deserializer: D) -> Result<Option<u128>, D::Error>
61where
62 D: Deserializer<'de>,
63{
64 #[derive(Deserialize)]
65 struct Helper(#[serde(deserialize_with = "deserialize_u128")] u128);
66
67 let helper = Option::<Helper>::deserialize(deserializer)?;
68 Ok(helper.map(|Helper(value)| value))
69}
70
71pub fn serialize_u128<S>(value: &u128, serializer: S) -> Result<S::Ok, S::Error>
73where
74 S: Serializer,
75{
76 serializer.serialize_str(&value.to_string())
77}
78
79pub fn serialize_optional_u128<S>(value: &Option<u128>, serializer: S) -> Result<S::Ok, S::Error>
81where
82 S: Serializer,
83{
84 match value {
85 Some(v) => serializer.serialize_some(&v.to_string()),
86 None => serializer.serialize_none(),
87 }
88}
89
90pub fn serialize_optional_u128_as_number<S>(
91 value: &Option<u128>,
92 serializer: S,
93) -> Result<S::Ok, S::Error>
94where
95 S: Serializer,
96{
97 match value {
98 Some(v) => serializer.serialize_some(&v),
99 None => serializer.serialize_none(),
100 }
101}
102
103pub fn deserialize_optional_u128_as_number<'de, D>(
105 deserializer: D,
106) -> Result<Option<u128>, D::Error>
107where
108 D: Deserializer<'de>,
109{
110 let value: Option<u128> = Option::deserialize(deserializer)?;
111 Ok(value)
112}
113
114pub fn serialize_u128_as_number<S>(value: &u128, serializer: S) -> Result<S::Ok, S::Error>
116where
117 S: Serializer,
118{
119 serializer.serialize_u128(*value)
120}
121
122pub fn deserialize_u128_as_number<'de, D>(deserializer: D) -> Result<u128, D::Error>
124where
125 D: Deserializer<'de>,
126{
127 u128::deserialize(deserializer)
128}
129
130pub fn deserialize_optional_u64<'de, D>(deserializer: D) -> Result<Option<u64>, D::Error>
132where
133 D: Deserializer<'de>,
134{
135 #[derive(Deserialize)]
136 struct Helper(#[serde(deserialize_with = "deserialize_u64")] u64);
137
138 let helper = Option::<Helper>::deserialize(deserializer)?;
139 Ok(helper.map(|Helper(value)| value))
140}
141
142#[cfg(test)]
143mod tests {
144 use super::*;
145 use serde::de::value::{
146 Error as ValueError, I64Deserializer, StringDeserializer, U64Deserializer,
147 };
148 use serde_json;
149
150 #[test]
151 fn test_deserialize_u128_from_string() {
152 let input = "12345";
153 let deserializer = StringDeserializer::<ValueError>::new(input.to_string());
154 let result = deserialize_u128(deserializer);
155 assert!(result.is_ok());
156 assert_eq!(result.unwrap(), 12345);
157 }
158
159 #[test]
160 fn test_deserialize_u128_from_string_large_value() {
161 let input = "340282366920938463463374607431768211455"; let deserializer = StringDeserializer::<ValueError>::new(input.to_string());
163 let result = deserialize_u128(deserializer);
164 assert!(result.is_ok());
165 assert_eq!(result.unwrap(), u128::MAX);
166 }
167
168 #[test]
169 fn test_deserialize_u128_from_invalid_string() {
170 let input = "not a number";
171 let deserializer = StringDeserializer::<ValueError>::new(input.to_string());
172 let result = deserialize_u128(deserializer);
173 assert!(result.is_err());
174 }
175
176 #[test]
177 fn test_deserialize_u128_from_u64() {
178 let input: u64 = 54321;
179 let deserializer = U64Deserializer::<ValueError>::new(input);
180 let result = deserialize_u128(deserializer);
181 assert!(result.is_ok());
182 assert_eq!(result.unwrap(), 54321u128);
183 }
184
185 #[test]
186 fn test_deserialize_u128_from_i64_positive() {
187 let input: i64 = 9876;
188 let deserializer = I64Deserializer::<ValueError>::new(input);
189 let result = deserialize_u128(deserializer);
190 assert!(result.is_ok());
191 assert_eq!(result.unwrap(), 9876u128);
192 }
193
194 #[test]
195 fn test_deserialize_u128_from_i64_negative() {
196 let input: i64 = -123;
197 let deserializer = I64Deserializer::<ValueError>::new(input);
198 let result = deserialize_u128(deserializer);
199 assert!(result.is_err());
200 }
201
202 #[derive(Deserialize)]
203 struct TestStructOptionalU128 {
204 #[serde(deserialize_with = "deserialize_optional_u128")]
205 value: Option<u128>,
206 }
207
208 #[test]
209 fn test_deserialize_optional_u128() {
210 let json = r#"{"value": "12345"}"#;
211 let result: TestStructOptionalU128 = serde_json::from_str(json).unwrap();
212 assert_eq!(result.value, Some(12345u128));
213 }
214
215 #[test]
216 fn test_deserialize_optional_u128_none() {
217 let json = r#"{"value": null}"#;
218 let result: TestStructOptionalU128 = serde_json::from_str(json).unwrap();
219 assert_eq!(result.value, None);
220 }
221
222 #[derive(Deserialize)]
223 struct TestStructOptionalU64 {
224 #[serde(deserialize_with = "deserialize_optional_u64")]
225 value: Option<u64>,
226 }
227
228 #[test]
229 fn test_deserialize_optional_u64() {
230 let json = r#"{"value": "12345"}"#;
231 let result: TestStructOptionalU64 = serde_json::from_str(json).unwrap();
232 assert_eq!(result.value, Some(12345u64));
233 }
234
235 #[test]
236 fn test_deserialize_optional_u64_none() {
237 let json = r#"{"value": null}"#;
238 let result: TestStructOptionalU64 = serde_json::from_str(json).unwrap();
239 assert_eq!(result.value, None);
240 }
241
242 #[test]
244 fn test_serialize_u128() {
245 let value: u128 = 340282366920938463463374607431768211455; let serialized = serde_json::to_string_pretty(&serde_json::json!({
247 "test": serde_json::to_value(value.to_string()).unwrap()
248 }))
249 .unwrap();
250
251 assert!(serialized.contains("340282366920938463463374607431768211455"));
252 }
253
254 use serde::{Deserialize, Serialize};
256
257 #[derive(Serialize, Deserialize, PartialEq, Debug)]
258 struct TestSerializeStruct {
259 #[serde(
260 serialize_with = "serialize_optional_u128",
261 deserialize_with = "deserialize_optional_u128"
262 )]
263 value: Option<u128>,
264 }
265
266 #[test]
267 fn test_serialize_deserialize_roundtrip_large_value() {
268 let original = TestSerializeStruct {
269 value: Some(u128::MAX),
270 };
271
272 let json = serde_json::to_string(&original).unwrap();
273 let deserialized: TestSerializeStruct = serde_json::from_str(&json).unwrap();
274
275 assert_eq!(original, deserialized);
276 assert!(json.contains("340282366920938463463374607431768211455"));
277 }
278
279 #[test]
280 fn test_serialize_deserialize_roundtrip_none() {
281 let original = TestSerializeStruct { value: None };
282
283 let json = serde_json::to_string(&original).unwrap();
284 let deserialized: TestSerializeStruct = serde_json::from_str(&json).unwrap();
285
286 assert_eq!(original, deserialized);
287 assert!(json.contains("null"));
288 }
289
290 #[test]
291 fn test_serialize_deserialize_roundtrip_small_value() {
292 let original = TestSerializeStruct { value: Some(12345) };
293
294 let json = serde_json::to_string(&original).unwrap();
295 let deserialized: TestSerializeStruct = serde_json::from_str(&json).unwrap();
296
297 assert_eq!(original, deserialized);
298 assert!(json.contains("12345"));
299 }
300}