cfx_rpc_primitives/
variadic_u64.rs1use serde::{Deserialize, Deserializer};
2use serde_utils::num::deserialize_u64_from_num_or_hex;
3use std::fmt;
4
5#[derive(Debug)]
7pub struct U64(u64);
8
9impl fmt::Display for U64 {
10 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
11 write!(f, "{}", self.0)
12 }
13}
14
15impl From<u64> for U64 {
16 fn from(value: u64) -> Self { U64(value) }
17}
18
19impl U64 {
20 pub fn as_u64(&self) -> u64 { self.0 }
21}
22
23impl<'de> Deserialize<'de> for U64 {
24 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
25 where D: Deserializer<'de> {
26 Ok(U64(deserialize_u64_from_num_or_hex(deserializer)?))
27 }
28}
29
30#[cfg(test)]
31mod tests {
32 use super::*;
33
34 #[test]
35 fn test_deserialize_u64_or_hex() {
36 let json_data = r#""0x1a""#;
37 let my_struct: U64 = serde_json::from_str(json_data).unwrap();
38 assert_eq!(my_struct.as_u64(), 26);
39
40 let json_data = r#"26"#;
41 let my_struct: U64 = serde_json::from_str(json_data).unwrap();
42 assert_eq!(my_struct.as_u64(), 26);
43 }
44}