use clap::Parser;
#[derive(Parser, Debug)]
#[command(
name = "node",
version,
about = "JavaScript on fusevm — a compiled JS runtime (bytecode VM + Cranelift JIT)",
long_about = None,
)]
pub struct Cli {
#[arg(short = 'e', long = "eval", value_name = "SRC")]
pub eval: Option<String>,
#[arg(short = 'p', long = "print", value_name = "SRC")]
pub print: Option<String>,
#[arg(long = "repl")]
pub repl: bool,
#[arg(long = "lsp")]
pub lsp: bool,
#[arg(long = "dap")]
pub dap: bool,
#[arg(long = "build")]
pub build: bool,
#[arg(long = "dump-bytecode")]
pub dump_bytecode: bool,
#[arg(long = "dump-tokens")]
pub dump_tokens: bool,
#[arg(long = "dump-ast")]
pub dump_ast: bool,
#[arg(long = "disasm")]
pub disasm: bool,
#[arg(long = "tiers")]
pub tiers: bool,
#[arg(long = "no-warnings")]
pub no_warnings: bool,
#[arg(long = "no-deprecation")]
pub no_deprecation: bool,
#[arg(long = "trace-warnings")]
pub trace_warnings: bool,
#[arg(long = "trace-deprecation")]
pub trace_deprecation: bool,
#[arg(value_name = "FILE")]
pub file: Option<String>,
#[arg(trailing_var_arg = true, allow_hyphen_values = true)]
pub argv: Vec<String>,
}
pub fn parse() -> Cli {
Cli::parse()
}
pub struct Argv {
pub exec: Vec<String>,
pub script: Option<String>,
pub user: Vec<String>,
}
pub fn split_argv<I: IntoIterator<Item = String>>(raw: I) -> Argv {
let mut out = Argv {
exec: Vec::new(),
script: None,
user: Vec::new(),
};
let mut it = raw.into_iter().skip(1);
let mut eval_seen = false;
while let Some(a) = it.next() {
if a == "-e" || a == "--eval" || a == "-p" || a == "--print" {
out.exec.push(a);
if let Some(src) = it.next() {
out.exec.push(src);
}
eval_seen = true;
} else if a.starts_with('-') && a != "-" {
out.exec.push(a);
} else {
if !eval_seen {
out.script = Some(a);
} else {
out.user.push(a);
}
out.user.extend(it);
break;
}
}
out
}