tendermint_proto/serializers/
from_str.rs

1//! Serialize and deserialize any `T` that implements [`FromStr`]
2//! and [`Display`] to convert from or into string. Note this can be used for
3//! all primitive data types.
4
5use core::fmt::Display;
6use core::str::FromStr;
7
8use serde::{de::Error as _, Deserialize, Deserializer, Serialize, Serializer};
9
10use crate::prelude::*;
11use crate::serializers::cow_str::CowStr;
12
13/// Deserialize string into T
14pub fn deserialize<'de, D, T>(deserializer: D) -> Result<T, D::Error>
15where
16    D: Deserializer<'de>,
17    T: FromStr,
18    <T as FromStr>::Err: Display,
19{
20    CowStr::deserialize(deserializer)?
21        .parse::<T>()
22        .map_err(D::Error::custom)
23}
24
25/// Serialize from T into string
26pub fn serialize<S, T>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
27where
28    S: Serializer,
29    T: Display,
30{
31    value.to_string().serialize(serializer)
32}
33
34#[cfg(test)]
35#[allow(unused_imports)]
36mod tests {
37    use crate::prelude::*;
38    use alloc::borrow::ToOwned;
39    use core::convert::Infallible;
40    use core::str::FromStr;
41    use serde::Deserialize;
42
43    struct ParsedStr(String);
44
45    impl FromStr for ParsedStr {
46        type Err = Infallible;
47
48        fn from_str(s: &str) -> Result<Self, Self::Err> {
49            Ok(Self(s.to_owned()))
50        }
51    }
52
53    #[derive(Deserialize)]
54    struct Foo {
55        #[serde(with = "super")]
56        msg: ParsedStr,
57    }
58
59    #[test]
60    fn can_deserialize_owned() {
61        const TEST_JSON: &str = r#"{ "msg": "\"Hello\"" }"#;
62        let v = serde_json::from_str::<Foo>(TEST_JSON).unwrap();
63        assert_eq!(v.msg.0, "\"Hello\"");
64    }
65}