tendermint_proto/serializers/
from_str.rs1use 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
13pub 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
25pub 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}