drive_abci/utils/
serialization.rs

1use serde::Deserialize;
2
3/// Deserialize a value from a string or a number.
4pub fn from_str_or_number<'de, D, T>(deserializer: D) -> Result<T, D::Error>
5where
6    D: serde::Deserializer<'de>,
7    T: serde::Deserialize<'de> + std::str::FromStr,
8    <T as std::str::FromStr>::Err: std::fmt::Display,
9{
10    use serde::de::Error;
11
12    let s = String::deserialize(deserializer)?;
13    s.parse::<T>().map_err(Error::custom)
14}
15
16/// Deserialize a value from an optional string or a number
17pub fn from_opt_str_or_number<'de, D, T>(deserializer: D) -> Result<Option<T>, D::Error>
18where
19    D: serde::Deserializer<'de>,
20    T: serde::Deserialize<'de> + std::str::FromStr,
21    <T as std::str::FromStr>::Err: std::fmt::Display,
22{
23    use serde::de::Error;
24
25    let s = Option::<String>::deserialize(deserializer)?;
26    match s {
27        Some(s) => {
28            if s.is_empty() {
29                Ok(None)
30            } else {
31                s.parse::<T>().map(Some).map_err(Error::custom)
32            }
33        }
34        None => Ok(None),
35    }
36}