gcode 0.3.2

A gcode parser for no-std applications.
Documentation
extern crate gcode;

use std::env;
use std::error::Error as StdError;
use std::fs::File;
use std::io::{self, Error, Read};
use std::process;

fn run() -> Result<(), Error> {
    let mut input = parse_args()?;

    let mut src = String::new();
    input.read_to_string(&mut src)?;

    for code in gcode::parse(&src) {
        println!("{:#?}", code);
    }

    Ok(())
}

fn main() {
    if let Err(e) = run() {
        eprintln!("ERROR: {}", e);

        let mut cause = e.cause();

        while let Some(c) = cause {
            eprintln!("\tCaused by: {}", c);
            cause = c.cause();
        }
    }
}

fn parse_args() -> Result<Box<Read>, Error> {
    for arg in env::args() {
        if arg == "-h" || arg == "--help" {
            usage();
        }
    }

    match env::args().nth(1) {
        Some(filename) => Ok(Box::new(File::open(filename)?)),
        None => Ok(Box::new(io::stdin())),
    }
}

fn usage() -> ! {
    eprintln!("USAGE: {} [filename]", env::args().next().unwrap());
    process::exit(1);
}