wit-text 0.1.0

Parser for the text format of WebAssembly Interface Types
Documentation
use anyhow::Context;
use getopts::Options;
use std::env;

fn main() -> anyhow::Result<()> {
    let mut opts = Options::new();
    opts.optopt("o", "", "set output file name", "NAME");
    opts.optflag("h", "help", "print this help menu");
    opts.optflag("", "no-validate", "don't validate the module");
    let matches = opts.parse(env::args_os().skip(1))?;
    if matches.opt_present("h") {
        print_usage(opts);
        return Ok(());
    }
    let input = if matches.free.len() == 1 {
        matches.free[0].clone()
    } else {
        print_usage(opts);
        std::process::exit(1);
    };

    let wasm = wit_text::parse_file(&input)?;
    if !matches.opt_present("no-validate") {
        wit_validator::validate(&wasm)?;
    }
    if let Some(output) = matches.opt_str("o") {
        std::fs::write(&output, wasm).context(format!("failed to write `{}`", output))?;
    }

    Ok(())
}

fn print_usage(opts: Options) {
    let program = env::args().next().unwrap();
    let brief = format!("Usage: {} FILE [options]", program);
    print!("{}", opts.usage(&brief));
}