Function serde_aux::field_attributes::deserialize_option_number_from_string[][src]

pub fn deserialize_option_number_from_string<'de, T, D>(
    deserializer: D
) -> Result<Option<T>, D::Error> where
    D: Deserializer<'de>,
    T: FromStr + Deserialize<'de>,
    <T as FromStr>::Err: Display

Deserializes an option number from string or a number.

Example:

use serde_aux::prelude::*;

#[derive(Debug, serde::Deserialize)]
struct MyStruct {
    #[serde(deserialize_with = "deserialize_option_number_from_string")]
    option_num: Option<f32>,
    #[serde(default, deserialize_with = "deserialize_option_number_from_string")]
    missing: Option<i32>
}
fn serde_qs_eq(s: &str, result: Option<f32>) {
    let a: MyStruct = serde_qs::from_str(s).unwrap();
    assert_eq!(a.option_num, result);
    assert_eq!(a.missing, None);
}
fn serde_qs_err(s: &str) {
    assert!(serde_qs::from_str::<MyStruct>(s).is_err());
}
fn serde_json_eq(s: &str, result: Option<f32>) {
    let a: MyStruct = serde_json::from_str(s).unwrap();
    assert_eq!(a.option_num, result);
    assert_eq!(a.missing, None);
}
fn serde_json_err(s: &str) {
    assert!(serde_json::from_str::<MyStruct>(s).is_err());
}

serde_qs_eq("option_num=1", Some(1.0));
serde_qs_eq("option_num=-1", Some(-1.0));
serde_qs_eq("option_num=0.1", Some(0.1));
serde_qs_eq("option_num=-0.1", Some(-0.1));
serde_qs_eq("option_num=", None);
serde_qs_eq("option_num", None);

serde_qs_err("option_num=true");
serde_qs_err("option_num=a");
serde_qs_err("option_num[a]=");
serde_qs_err("option_num[]=");

serde_json_eq(r#" { "option_num": "1" } "#, Some(1.0));
serde_json_eq(r#" { "option_num": "-1" } "#, Some(-1.0));
serde_json_eq(r#" { "option_num": "0.1" } "#, Some(0.1));
serde_json_eq(r#" { "option_num": "-0.1" } "#, Some(-0.1));
serde_json_eq(r#" { "option_num": 1 } "#, Some(1.0));
serde_json_eq(r#" { "option_num": -1 } "#, Some(-1.0));
serde_json_eq(r#" { "option_num": 0.1 } "#, Some(0.1));
serde_json_eq(r#" { "option_num": -0.1 } "#, Some(-0.1));
serde_json_eq(r#" { "option_num": "" } "#, None);
serde_json_eq(r#" { "option_num": null } "#, None);

serde_json_err(r#" { "option_num": true } "#);
serde_json_err(r#" { "option_num": "a" } "#);
serde_json_err(r#" { "option_num": {} } "#);
serde_json_err(r#" { "option_num": [] } "#);