guartcl 0.6.0-alpha1

Enhanced Jim Tcl.
Documentation
use std::{
    env,
    process::{self, ExitCode},
};

use clap::Parser;
use guartcl::guardian_interp;
use jimtcl::{JimError, JimResult, cli::Jimsh, tcl_error};

/// Enhanced Jim Tcl shell, with Rust-based superpowers.
#[derive(Parser)]
#[command(name = "guarsh")]
struct GuardianShell {
    #[command(flatten)]
    jimsh: Jimsh,

    /// Parse command-line arguments with Usage.
    #[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::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())
}