fits-rs 0.3.0

FITS encoder and decoder in Rust
Documentation
#[macro_use]
extern crate nom;

use nom::{IResult,digit};

use std::str;
use std::str::FromStr;

named!(unsigned_number<i64>,
       map_res!(
           map_res!(
               digit,
               str::from_utf8),
           FromStr::from_str
       ));

named!(number<i64>, map!(
    pair!(
        opt!(alt!(tag!("+") | tag!("-"))),
        unsigned_number
    ),
    |(sign, value): (Option<&[u8]>, i64)| {
        sign
            .and_then(|s| if s[0] == ('-' as u8) { Some(-1i64) } else { None })
            .unwrap_or(1i64) * value
    }
));

#[test]
fn number_test() {
    assert_eq!(number(&b"3"[..]), IResult::Done(&b""[..], 3));
    assert_eq!(number(&b"37"[..]), IResult::Done(&b""[..], 37));
    assert_eq!(number(&b"373"[..]), IResult::Done(&b""[..], 373));
    assert_eq!(number(&b"3733"[..]), IResult::Done(&b""[..], 3733));
    assert_eq!(number(&b"37337"[..]), IResult::Done(&b""[..], 37337));
    assert_eq!(number(&b"373379"[..]), IResult::Done(&b""[..], 373379));

    assert_eq!(number(&b"-3"[..]), IResult::Done(&b""[..], -3));
    assert_eq!(number(&b"-37"[..]), IResult::Done(&b""[..], -37));
    assert_eq!(number(&b"-373"[..]), IResult::Done(&b""[..], -373));
    assert_eq!(number(&b"-3733"[..]), IResult::Done(&b""[..], -3733));
    assert_eq!(number(&b"-37337"[..]), IResult::Done(&b""[..], -37337));
    assert_eq!(number(&b"-373379"[..]), IResult::Done(&b""[..], -373379));

    assert_eq!(number(&b"+3"[..]), IResult::Done(&b""[..], 3));
    assert_eq!(number(&b"+37"[..]), IResult::Done(&b""[..], 37));
    assert_eq!(number(&b"+373"[..]), IResult::Done(&b""[..], 373));
    assert_eq!(number(&b"+3733"[..]), IResult::Done(&b""[..], 3733));
    assert_eq!(number(&b"+37337"[..]), IResult::Done(&b""[..], 37337));
    assert_eq!(number(&b"+373379"[..]), IResult::Done(&b""[..], 373379));
}