[−][src]Derive Macro serde_with::DeserializeFromStr
#[derive(DeserializeFromStr)]
Deserialize value by using it's FromStr
implementation
This is an alternative way to implement Deserialize
for types which also implement FromStr
by deserializing the type from string.
Ensure that the struct/enum also implements FromStr
.
If the implementation is missing you will get a error message like
error[E0277]: the trait bound `Struct: std::str::FromStr` is not satisfied
Additionally, FromStr::Err
must implement Display
as otherwise you will see a rather unhelpful error message
Serialization with Display
is available with the matching SerializeDisplay
derive.
Example
ⓘThis example is not tested
use std::str::FromStr; #[derive(DeserializeFromStr)] struct A { a: u32, b: bool, } impl FromStr for A { type Err = String; /// Parse a value like `123<>true` fn from_str(s: &str) -> Result<Self, Self::Err> { let mut parts = s.split("<>"); let number = parts .next() .ok_or_else(|| "Missing first value".to_string())? .parse() .map_err(|err: ParseIntError| err.to_string())?; let bool = parts .next() .ok_or_else(|| "Missing second value".to_string())? .parse() .map_err(|err: ParseBoolError| err.to_string())?; Ok(Self { a: number, b: bool }) } } let a: A = serde_json::from_str("\"159<>true\"").unwrap(); assert_eq!(A { a: 159, b: true }, a);