drive_abci/utils/
serialization.rs1use serde::Deserialize;
2
3pub 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
16pub 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}