use std::{env, mem, os::unix::ffi::OsStrExt, path::Path, process};
use clap::Parser;
use guartcl::guardian_interp;
use jimtcl::{JimResult, cli::Jimsh};
static GUARTCL_VERSION: &str = env!("CARGO_PKG_VERSION");
#[derive(Parser)]
#[command(name = "guarsh")]
struct GuardianShell {
#[command(flatten)]
jimsh: Jimsh,
#[arg(short = 'U', long = "usage")]
usage: bool,
}
fn main() -> JimResult<()> {
let interp = guardian_interp()?;
let cli = GuardianShell::parse();
if cli.jimsh.print_version {
println!(
"Guardian Tcl {} (Jim version {})",
GUARTCL_VERSION,
interp.jim_version()?
);
return Ok(());
}
if let Some(argv0) = env::args_os().next() {
interp.set_variable("jim::argv0", argv0.as_bytes())?;
let path = Path::new(&argv0).canonicalize()?;
interp.set_variable("jim::exe", path.as_os_str().as_bytes())?;
}
cli.jimsh.setup_env(&interp)?;
if cli.usage
&& let Some(script) = cli.jimsh.script_file()
{
guartcl::usage::parse_args(&interp, script.as_ref(), &cli.jimsh.script)?;
}
let rc = cli.jimsh.run(&interp)?;
mem::drop(interp);
process::exit(rc);
}