use clap::Parser;
#[derive(Parser)]
#[command(name = "meta-ast", version, about = "Polyglot static analyzer")]
pub enum Cli {
Inspect(InspectArgs),
Graph(GraphArgs),
#[cfg(feature = "metacall-deploy")]
Deploy(DeployArgs),
}
fn parse_format(s: &str) -> Result<crate::output::OutputFormat, String> {
match s.to_lowercase().as_str() {
"json" => Ok(crate::output::OutputFormat::Json),
"yaml" | "yml" => Ok(crate::output::OutputFormat::Yaml),
_ => Err(format!("invalid format '{s}': expected 'json' or 'yaml'")),
}
}
#[derive(Parser)]
pub struct InspectArgs {
pub path: std::path::PathBuf,
#[arg(short, long)]
pub output: Option<std::path::PathBuf>,
#[arg(short, long)]
pub language: Option<String>,
#[arg(short = 'f', long, default_value = "json", value_parser = parse_format)]
pub format: crate::output::OutputFormat,
}
#[derive(Parser)]
pub struct GraphArgs {
pub path: std::path::PathBuf,
#[arg(short, long)]
pub output: Option<std::path::PathBuf>,
#[arg(short, long)]
pub language: Option<String>,
#[arg(short = 'f', long, default_value = "json", value_parser = parse_format)]
pub format: crate::output::OutputFormat,
#[arg(long)]
pub html: bool,
#[cfg(feature = "dataflow")]
#[arg(long)]
pub datagraph: bool,
#[cfg(feature = "watch")]
#[arg(long)]
pub watch: bool,
#[cfg(feature = "watch")]
#[arg(long, default_value = "200")]
pub watch_debounce: u64,
}
#[cfg(feature = "metacall-deploy")]
#[derive(Parser)]
pub struct DeployArgs {
pub path: std::path::PathBuf,
#[arg(short = 'f', long, default_value = "json", value_parser = parse_format)]
pub format: crate::output::OutputFormat,
#[arg(long)]
pub check: bool,
#[arg(short, long, default_value = ".")]
pub out: std::path::PathBuf,
}