stdf 0.2.0

Standard Test Data Format (STDF) serialization and data processing
Documentation
use std::env;
use std::fs::File;
use std::io::{Error, ErrorKind};

extern crate byte;
use byte::BytesExt;

extern crate stdf;
use stdf::records::{Header, V4};

extern crate memmap;
use memmap::MmapOptions;

fn main() {
    let args: Vec<_> = env::args().collect();
    if args.len() <= 1 {
        println!("Usage: {} <stdf file>", args[0]);
        return;
    }
    match dump_stdf(&args[1]) {
        Ok(_) => {}
        Err(e) => println!("{:?}", e),
    };
}

fn dump_stdf(filename: &str) -> Result<(), Error> {
    let f = File::open(filename)?;
    let m = unsafe { MmapOptions::new().map(&f)? };
    let bytes = &m[..];
    let endian = Header::detect_endian(bytes)
        .map_err(|x| Error::new(ErrorKind::Other, format!("{:?}", x)))?;
    let offset = &mut 0;
    loop {
        match bytes.read_with::<V4>(offset, endian) {
            Ok(v4) => println!("{:?}", v4),
            Err(byte::Error::BadOffset(x)) => {
                if x == bytes.len() {
                    return Ok(());
                } else {
                    return Err(Error::new(
                        ErrorKind::Other,
                        format!("bad offset {} before EOF", x),
                    ));
                }
            }
            Err(e) => return Err(Error::new(ErrorKind::Other, format!("{:?}", e))),
        };
    }
}