elys_std/serde/
mod.rs

1pub mod as_str {
2    use serde::{de, Deserialize, Deserializer, Serializer};
3    use std::{fmt::Display, str::FromStr};
4
5    pub fn deserialize<'de, T, D>(deserializer: D) -> Result<T, D::Error>
6    where
7        T: FromStr,
8        T::Err: Display,
9        D: Deserializer<'de>,
10    {
11        let s = String::deserialize(deserializer)?;
12        T::from_str(&s).map_err(de::Error::custom)
13    }
14
15    pub fn serialize<S, T>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
16    where
17        S: Serializer,
18        T: Display,
19    {
20        serializer.serialize_str(&value.to_string())
21    }
22}
23
24pub mod as_str_vec {
25    use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
26    use std::{fmt::Display, str::FromStr};
27
28    pub fn deserialize<'de, T, D>(deserializer: D) -> Result<Vec<T>, D::Error>
29    where
30        T: FromStr,
31        T::Err: Display,
32        D: Deserializer<'de>,
33    {
34        let vec_of_strings: Vec<String> = Vec::deserialize(deserializer)?;
35        vec_of_strings
36            .into_iter()
37            .map(|s| T::from_str(&s).map_err(de::Error::custom))
38            .collect()
39    }
40
41    pub fn serialize<S, T>(values: &[T], serializer: S) -> Result<S::Ok, S::Error>
42    where
43        S: Serializer,
44        T: Display,
45    {
46        let vec_of_strings: Vec<String> = values.iter().map(|value| value.to_string()).collect();
47        vec_of_strings.serialize(serializer)
48    }
49}
50
51pub mod as_base64_encoded_string {
52    use cosmwasm_std::Binary;
53    use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
54
55    pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<u8>, D::Error>
56    where
57        D: Deserializer<'de>,
58    {
59        let encoded_string = String::deserialize(deserializer)?;
60        Binary::from_base64(&encoded_string)
61            .map(|b| b.to_vec())
62            .map_err(de::Error::custom)
63    }
64
65    pub fn serialize<S>(values: &[u8], serializer: S) -> Result<S::Ok, S::Error>
66    where
67        S: Serializer,
68    {
69        Binary(values.to_vec()).to_base64().serialize(serializer)
70    }
71}
72
73pub mod as_option_base64_encoded_string {
74    use cosmwasm_std::Binary;
75    use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
76
77    pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<Vec<u8>>, D::Error>
78    where
79        D: Deserializer<'de>,
80    {
81        let encoded_string: Option<String> = Option::deserialize(deserializer)?;
82        match encoded_string {
83            Some(s) => Binary::from_base64(&s)
84                .map(|b| Some(b.to_vec()))
85                .map_err(de::Error::custom),
86            None => Ok(None),
87        }
88    }
89
90    pub fn serialize<S>(value: &Option<Vec<u8>>, serializer: S) -> Result<S::Ok, S::Error>
91    where
92        S: Serializer,
93    {
94        match value {
95            Some(vec) => {
96                let encoded_string = Binary(vec.clone()).to_base64();
97                encoded_string.serialize(serializer)
98            }
99            None => serializer.serialize_none(),
100        }
101    }
102}