use std::{
env,
process::{self, ExitCode},
};
use clap::Parser;
use guartcl::guardian_interp;
use jimtcl::{JimError, JimResult, cli::Jimsh, tcl_error};
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<process::ExitCode> {
env_logger::try_init().map_err(|_| tcl_error!("cannot initialize logging"))?;
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(ExitCode::SUCCESS);
}
cli.jimsh.setup_env(&interp, env::args_os().next())?;
if cli.usage
&& let Some(script) = cli.jimsh.script_file()
{
let mut args = Vec::with_capacity(cli.jimsh.script_and_args.len());
for arg in &cli.jimsh.script_and_args {
let arg = arg.to_str().ok_or(JimError::InvalidUtf8)?.to_owned();
args.push(arg);
}
guartcl::usage::parse_args(&interp, script.as_ref(), &args)?;
}
let rc = cli.jimsh.run(&interp)?;
let rc = u8::try_from(rc).map_err(|e| tcl_error!("out-of-bounds exit code {}", e))?;
Ok(rc.into())
}