cfx_rpc_primitives/
variadic_u64.rs

1use serde::{Deserialize, Deserializer};
2use serde_utils::num::deserialize_u64_from_num_or_hex;
3use std::fmt;
4
5// support both hex strings and number deserialization
6#[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}