near_vm_logic/
serde_with.rs

1/// Serialize `Vec<u8>` as base64 encoding.
2pub mod bytes_as_base64 {
3    use serde::{Deserialize, Deserializer, Serializer};
4
5    pub fn serialize<S>(arr: &Vec<u8>, serializer: S) -> Result<S::Ok, S::Error>
6    where
7        S: Serializer,
8    {
9        serializer.serialize_str(&base64::encode(arr))
10    }
11
12    pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<u8>, D::Error>
13    where
14        D: Deserializer<'de>,
15    {
16        let s = String::deserialize(deserializer)?;
17        Ok(base64::decode(&s).expect("Failed to deserialize base64 string"))
18    }
19}
20
21/// Serialize `Vec<u8>` as `String`.
22pub mod bytes_as_str {
23    use serde::{Deserialize, Deserializer, Serializer};
24
25    pub fn serialize<S>(arr: &Vec<u8>, serializer: S) -> Result<S::Ok, S::Error>
26    where
27        S: Serializer,
28    {
29        serializer.serialize_str(&String::from_utf8(arr.clone()).unwrap())
30    }
31
32    pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<u8>, D::Error>
33    where
34        D: Deserializer<'de>,
35    {
36        let s = String::deserialize(deserializer)?;
37        Ok(s.into_bytes())
38    }
39}
40
41/// Serialize `Vec<u8>` as base58 encoding.
42pub mod bytes_as_base58 {
43    use serde::{Deserialize, Deserializer, Serializer};
44
45    pub fn serialize<S>(arr: &Vec<u8>, serializer: S) -> Result<S::Ok, S::Error>
46    where
47        S: Serializer,
48    {
49        serializer.serialize_str(&bs58::encode(arr).into_string())
50    }
51
52    pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<u8>, D::Error>
53    where
54        D: Deserializer<'de>,
55    {
56        let s = String::deserialize(deserializer)?;
57        Ok(bs58::decode(s).into_vec().expect("Failed to deserialize base58 string"))
58    }
59}
60
61/// Serialize `Vec<Vec<u8>>` as `Vec<String>`.
62pub mod vec_bytes_as_str {
63    use std::fmt;
64
65    use serde::de::{SeqAccess, Visitor};
66    use serde::ser::SerializeSeq;
67    use serde::{Deserializer, Serializer};
68
69    pub fn serialize<S>(data: &Vec<Vec<u8>>, serializer: S) -> Result<S::Ok, S::Error>
70    where
71        S: Serializer,
72    {
73        let mut seq = serializer.serialize_seq(Some(data.len()))?;
74        for v in data {
75            seq.serialize_element(&String::from_utf8(v.clone()).unwrap())?;
76        }
77        seq.end()
78    }
79
80    struct VecBytesVisitor;
81
82    impl<'de> Visitor<'de> for VecBytesVisitor {
83        type Value = Vec<Vec<u8>>;
84
85        fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
86            formatter.write_str("an array with string in the first element")
87        }
88
89        fn visit_seq<A>(self, mut seq: A) -> Result<Vec<Vec<u8>>, A::Error>
90        where
91            A: SeqAccess<'de>,
92        {
93            let mut vec = Vec::new();
94            while let Some(s) = seq.next_element::<String>()? {
95                vec.push(s.into_bytes());
96            }
97            Ok(vec)
98        }
99    }
100
101    pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<Vec<u8>>, D::Error>
102    where
103        D: Deserializer<'de>,
104    {
105        deserializer.deserialize_seq(VecBytesVisitor {})
106    }
107}
108
109pub mod u128_dec_format {
110    use serde::de;
111    use serde::{Deserialize, Deserializer, Serializer};
112
113    pub fn serialize<S>(num: &u128, serializer: S) -> Result<S::Ok, S::Error>
114    where
115        S: Serializer,
116    {
117        serializer.serialize_str(&format!("{}", num))
118    }
119
120    pub fn deserialize<'de, D>(deserializer: D) -> Result<u128, D::Error>
121    where
122        D: Deserializer<'de>,
123    {
124        let s = String::deserialize(deserializer)?;
125        u128::from_str_radix(&s, 10).map_err(de::Error::custom)
126    }
127}
128
129pub mod u128_dec_format_compatible {
130    //! This in an extension to `u128_dec_format` that serves a compatibility layer role to
131    //! deserialize u128 from a "small" JSON number (u64).
132    //!
133    //! It is unfortunate that we cannot enable "arbitrary_precision" feature in serde_json due to
134    //! a bug: https://github.com/serde-rs/json/issues/505
135    use serde::{de, Deserialize, Deserializer};
136
137    pub use super::u128_dec_format::serialize;
138
139    #[derive(Deserialize)]
140    #[serde(untagged)]
141    enum U128 {
142        Number(u64),
143        String(String),
144    }
145
146    pub fn deserialize<'de, D>(deserializer: D) -> Result<u128, D::Error>
147    where
148        D: Deserializer<'de>,
149    {
150        match U128::deserialize(deserializer)? {
151            U128::Number(value) => Ok(u128::from(value)),
152            U128::String(value) => u128::from_str_radix(&value, 10).map_err(de::Error::custom),
153        }
154    }
155}