wast2json 0.1.0

A wast2json implementation written in Rust
Documentation
use clap::Parser;
use std::{collections::HashMap, env, fs, path::PathBuf};
use wast2json::{wast2json, Wast2JsonOptions};

#[derive(Parser, Debug)]
#[command(about, version)]
struct Args {
    #[command(flatten)]
    verbose: clap_verbosity_flag::Verbosity,

    #[arg(
        short = 'p',
        long = "pretty-print",
        group = "json",
        help = "Pretty-print JSON output"
    )]
    pretty_print: bool,

    #[arg(
        short = 'c',
        long = "compact",
        group = "json",
        help = "Compact JSON output"
    )]
    compact: bool,

    #[arg(short, long, value_parser, help = "Output .json file")]
    output: Option<PathBuf>,

    #[arg(value_parser, help = "Input .wast file")]
    input: PathBuf,
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let args = Args::parse();

    env_logger::builder()
        .filter_level(args.verbose.log_level_filter())
        .parse_default_env()
        .init();

    log::debug!("Arguments: {:?}", args);

    let input = &args.input;
    log::debug!("Input file: {:?}", input);

    let output = match args.output {
        Some(output) => output,
        None => env::current_dir()?
            .join(input.file_name().unwrap_or_default())
            .with_extension("json"),
    };
    log::debug!("Output file: {:?}", output);

    let module_basename = output.file_stem().unwrap_or_default().to_string_lossy();

    let source = fs::read_to_string(input)?;
    let options = Wast2JsonOptions::default();
    let mut module_files = HashMap::new();

    let script = wast2json(
        input,
        &source,
        &module_basename,
        &mut module_files,
        &options,
    )?;

    log::debug!("Writing {:?}", output);
    let file = std::fs::File::create(&output)?;
    if args.compact {
        script.write_compact(file)?;
    } else if args.pretty_print {
        script.write_pretty(file)?;
    } else {
        script.write(file)?;
    }

    for (filename, bytes) in module_files.iter() {
        let filename = output.with_file_name(filename);
        fs::write(filename, bytes)?;
    }

    Ok(())
}