serde-humanize-rs 0.1.0

A Serde deserializer for duration and byte-size.
Documentation
use serde_json;
use std::time::Duration;

#[test]
fn test_parse_duration() {
    #[derive(Deserialize)]
    struct Foo {
        #[serde(with = "super")]
        time: Duration,
    }

    let json = r#"{"time": "15s"}"#;
    let foo = serde_json::from_str::<Foo>(json).unwrap();
    assert_eq!(foo.time, Duration::from_secs(15));
}

#[test]
fn test_parse_option_duration() {
    #[derive(Deserialize)]
    struct Foo {
        #[serde(with = "super")]
        time: Option<Duration>,
    }

    let json = r#"{"time": "15s"}"#;
    let foo = serde_json::from_str::<Foo>(json).unwrap();
    assert_eq!(foo.time, Some(Duration::from_secs(15)));

    let json2 = r#"{"time": null}"#;
    let foo2 = serde_json::from_str::<Foo>(json2).unwrap();
    assert_eq!(foo2.time, None);
}

#[test]
fn test_parse_byte_size() {
    #[derive(Deserialize)]
    struct Foo {
        #[serde(with = "super")]
        size: usize,
    }

    let json = r#"{"size": "1 M"}"#;
    let foo = serde_json::from_str::<Foo>(json).unwrap();
    assert_eq!(foo.size, 1_000_000);
}

#[test]
fn test_parse_option_byte_size() {
    #[derive(Deserialize)]
    struct Foo {
        #[serde(with = "super")]
        size: Option<usize>,
    }

    let json = r#"{"size": "1 M"}"#;
    let foo = serde_json::from_str::<Foo>(json).unwrap();
    assert_eq!(foo.size, Some(1_000_000));

    let json2 = r#"{"size": null}"#;
    let foo2 = serde_json::from_str::<Foo>(json2).unwrap();
    assert_eq!(foo2.size, None);
}