iso-8601 0.4.1

Fully compliant ISO 8601 parser.
Documentation
mod date;
mod time;
mod datetime;

pub use self::{
    date::*,
    time::*,
    datetime::*
};

use {
    std::ops::{
        AddAssign,
        MulAssign
    },
    nom
};

fn buf_to_int<T>(buf: &[u8]) -> T
where T: AddAssign + MulAssign + From<u8> {
    let mut sum = T::from(0);
    for digit in buf {
        sum *= T::from(10);
        sum += T::from(*digit - b'0');
    }
    sum
}

named!(sign <i8>, alt!(
    one_of!("-\u{2212}\u{2010}") => { |_| -1 } |
    char!('+')                   => { |_|  1 }
));

named!(frac32 <f32>, do_parse!(
    peek!(char!('.')) >>
    fraction: flat_map!(nom::number::complete::recognize_float, parse_to!(f32)) >>
    (fraction)
));

#[cfg(test)]
mod tests {
    use {
        std::num::NonZeroUsize,
        nom::{
            Err,
            error::{
                Error,
                ErrorKind::Alt
            },
            Needed::Size
        }
    };

    #[test]
    fn sign() {
        assert_eq!(super::sign(b"-"), Ok((&[][..], -1)));
        assert_eq!(super::sign(b"+"), Ok((&[][..],  1)));
        assert_eq!(super::sign(b"" ), Err(Err::Incomplete(Size(NonZeroUsize::new(1).unwrap()))));
        assert_eq!(super::sign(b" "), Err(Err::Error(Error { input: &b" "[..], code: Alt })));
    }
}