use clap::{Parser, Subcommand};
use std::path::PathBuf;
#[derive(Parser)]
#[command(name = "wj")]
#[command(about = "Windjammer - A simple language that transpiles to Rust", long_about = None)]
#[command(version)]
pub struct Cli {
#[command(subcommand)]
pub command: Commands,
}
#[derive(Subcommand)]
pub enum Commands {
New {
#[arg(value_name = "NAME")]
name: String,
#[arg(short, long, default_value = "cli")]
template: String,
},
Build {
#[arg(value_name = "FILE")]
path: PathBuf,
#[arg(short, long, value_name = "DIR")]
output: Option<PathBuf>,
#[arg(short, long)]
release: bool,
#[arg(short, long, value_name = "TARGET", default_value = "rust")]
target: String,
#[arg(long, value_name = "MODE", default_value = "auto")]
defer_drop: String,
#[arg(long, value_name = "BYTES")]
defer_drop_threshold: Option<usize>,
#[arg(long)]
minify: bool,
#[arg(long)]
tree_shake: bool,
#[arg(long)]
source_maps: bool,
#[arg(long)]
polyfills: bool,
#[arg(long)]
v8_optimize: bool,
#[arg(long)]
check: bool,
#[arg(long)]
raw_errors: bool,
#[arg(long)]
fix: bool,
#[arg(short, long)]
verbose: bool,
#[arg(short, long)]
quiet: bool,
#[arg(long, value_name = "PATH")]
filter_file: Option<PathBuf>,
#[arg(long, value_name = "TYPE")]
filter_type: Option<String>,
#[arg(long)]
library: bool,
#[arg(long)]
module_file: bool,
#[arg(long)]
no_cargo: bool,
#[arg(long)]
no_lint: bool,
#[arg(long)]
no_generate_cargo_toml: bool,
#[arg(long, value_name = "NAME=PATH")]
metadata: Vec<String>,
},
Run {
#[arg(value_name = "FILE")]
path: PathBuf,
#[arg(trailing_var_arg = true)]
args: Vec<String>,
#[arg(short, long, value_name = "TARGET", default_value = "rust")]
target: String,
#[arg(long)]
interpret: bool,
#[arg(long, value_name = "MODE", default_value = "auto")]
defer_drop: String,
#[arg(long, value_name = "BYTES")]
defer_drop_threshold: Option<usize>,
},
Repl {},
Test {
#[arg(value_name = "PATH")]
path: Option<PathBuf>,
#[arg(short, long)]
filter: Option<String>,
#[arg(long)]
nocapture: bool,
#[arg(long, default_value = "true")]
parallel: bool,
#[arg(long)]
json: bool,
},
Fmt {
#[arg(long)]
check: bool,
},
Lint {
#[arg(value_name = "PATH")]
path: PathBuf,
#[arg(long)]
strict: bool,
},
Check,
Add {
#[arg(value_name = "PACKAGE")]
package: String,
#[arg(short, long)]
version: Option<String>,
#[arg(short, long)]
features: Option<String>,
#[arg(short, long)]
path: Option<String>,
},
Remove {
#[arg(value_name = "PACKAGE")]
package: String,
},
Update {
#[arg(long)]
check: bool,
#[arg(long)]
force: bool,
},
Stats {
#[arg(long)]
clear: bool,
#[arg(short, long)]
verbose: bool,
},
Errors {
file: PathBuf,
#[arg(short, long, default_value = "./build")]
output: PathBuf,
},
Docs {
#[arg(short, long, default_value = "./docs/errors")]
output: PathBuf,
#[arg(short, long, default_value = "html")]
format: String,
},
Explain {
code: String,
},
AgentIndex {
#[arg(short, long, default_value = "agent_index")]
output: PathBuf,
},
ShaderCompile {
#[arg(value_name = "FILE")]
input: PathBuf,
#[arg(short, long, value_name = "FILE")]
output: Option<PathBuf>,
},
ValidateWjsl {
#[arg(value_name = "DIR")]
path: PathBuf,
},
Clean {
#[arg(long)]
all: bool,
},
#[command(name = "self-install")]
SelfInstall,
#[command(external_subcommand)]
Plugin(Vec<String>),
}