use clap::{
Args, Parser, Subcommand, ValueEnum,
builder::{
Styles,
styling::{AnsiColor, Effects},
},
};
use clap_complete::Shell;
use crate::engine_flags::EngineFlags;
const STYLES: Styles = Styles::styled()
.header(AnsiColor::BrightGreen.on_default().effects(Effects::BOLD))
.usage(AnsiColor::BrightGreen.on_default().effects(Effects::BOLD))
.literal(AnsiColor::BrightCyan.on_default().effects(Effects::BOLD))
.placeholder(AnsiColor::Cyan.on_default())
.error(AnsiColor::BrightRed.on_default().effects(Effects::BOLD))
.valid(AnsiColor::BrightCyan.on_default().effects(Effects::BOLD))
.invalid(AnsiColor::Yellow.on_default());
#[derive(Parser)]
#[command(
name = "tinywasm",
about = "TinyWasm CLI",
styles = STYLES,
version,
args_conflicts_with_subcommands = true,
subcommand_negates_reqs = true
)]
pub struct Cli {
#[arg(long, global = true, value_enum, default_value_t = LogLevel::Info)]
pub log_level: LogLevel,
#[command(subcommand)]
pub command: Option<Commands>,
#[command(flatten)]
pub run: RunArgs,
}
#[derive(Subcommand)]
pub enum Commands {
Run(RunArgs),
Compile(CompileArgs),
Dump(ModuleInputArgs),
Inspect(ModuleInputArgs),
#[cfg(feature = "wast")]
Wast(WastArgs),
Completion(CompletionArgs),
}
#[derive(Args, Clone)]
pub struct RunArgs {
pub module: Option<String>,
#[arg(long)]
pub invoke: Option<String>,
#[command(flatten)]
pub engine: EngineFlags,
#[arg(trailing_var_arg = true)]
pub args: Vec<String>,
}
#[derive(Args, Clone)]
pub struct CompileArgs {
pub input: String,
#[arg(short, long)]
pub output: Option<String>,
#[arg(short, long)]
pub force: bool,
}
#[derive(Args, Clone)]
pub struct ModuleInputArgs {
pub module: String,
}
#[derive(Args, Clone)]
pub struct CompletionArgs {
pub shell: Shell,
}
#[cfg(feature = "wast")]
#[derive(Args, Clone)]
pub struct WastArgs {
#[arg(required = true)]
pub paths: Vec<String>,
}
#[derive(Clone, Copy, ValueEnum)]
pub enum LogLevel {
Trace,
Debug,
Info,
Warn,
Error,
}
impl From<LogLevel> for log::LevelFilter {
fn from(value: LogLevel) -> Self {
match value {
LogLevel::Trace => log::LevelFilter::Trace,
LogLevel::Debug => log::LevelFilter::Debug,
LogLevel::Info => log::LevelFilter::Info,
LogLevel::Warn => log::LevelFilter::Warn,
LogLevel::Error => log::LevelFilter::Error,
}
}
}