use anyhow::{Context, Result};
use clap::Parser;
use std::{borrow::Cow, path::PathBuf};
use wasmtime_cli_flags::CommonOptions;
#[derive(Parser, PartialEq)]
pub struct ExploreCommand {
#[command(flatten)]
common: CommonOptions,
#[arg(long, value_name = "TARGET")]
target: Option<String>,
#[arg(required = true, value_name = "MODULE")]
module: PathBuf,
#[arg(short, long)]
output: Option<PathBuf>,
}
impl ExploreCommand {
pub fn execute(mut self) -> Result<()> {
self.common.init_logging()?;
let config = self.common.config(self.target.as_deref(), None)?;
let bytes =
Cow::Owned(std::fs::read(&self.module).with_context(|| {
format!("failed to read Wasm module: {}", self.module.display())
})?);
#[cfg(feature = "wat")]
let bytes = wat::parse_bytes(&bytes).map_err(|mut e| {
e.set_path(&self.module);
e
})?;
let output = self
.output
.clone()
.unwrap_or_else(|| self.module.with_extension("explore.html"));
let output_file = std::fs::File::create(&output)
.with_context(|| format!("failed to create file: {}", output.display()))?;
let mut output_file = std::io::BufWriter::new(output_file);
wasmtime_explorer::generate(&config, self.target.as_deref(), &bytes, &mut output_file)?;
println!("Exploration written to {}", output.display());
Ok(())
}
}