serde-humanize-rs 0.1.1

A Serde deserializer for duration and byte-size.
Documentation
use de::DE;
use humanize_rs::time::Time;
use humanize_rs::ParseError;
use serde::de::{Deserializer, Error, Unexpected, Visitor};
use std::fmt;
use std::time::SystemTime;

impl DE for SystemTime {
    fn de<'de, D>(d: D) -> Result<SystemTime, D::Error>
    where
        D: Deserializer<'de>,
    {
        struct V;

        impl<'v> Visitor<'v> for V {
            type Value = SystemTime;

            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
                formatter.write_str("expecting rfc3339 datetime string")
            }

            fn visit_str<E>(self, s: &str) -> Result<SystemTime, E>
            where
                E: Error,
            {
                s.parse::<Time>()
                    .and_then(|t| t.to_system_time().ok_or(ParseError::Overflow))
                    .map_err(|_| Error::invalid_value(Unexpected::Str(s), &self))
            }
        }

        d.deserialize_str(V)
    }
}