jimtcl 0.3.0

Embed Jim Tcl in Rust.
Documentation
//! Command-line shells.

use std::{os::unix::ffi::OsStrExt, path::PathBuf};

use clap::Parser;

use crate::{Interp, JimObject, JimResult};

/// Clap CLI for implementing jimsh-like shells.
#[derive(Parser, Debug)]
#[command(version)]
pub struct Jimsh {
    /// Tcl script to exeecute.
    script: Option<PathBuf>,

    /// Additional command-line arguments.
    args: Vec<String>,
}

impl Jimsh {
    /// Run the command line in the specified interpreter.  Returns the Jim
    /// exit code on success.
    pub fn run(&self, interp: &Interp) -> JimResult<i32> {
        let result = if let Some(path) = &self.script {
            interp.set_variable("argv0", path.as_os_str().as_bytes())?;
            let argv = JimObject::empty(interp);
            for arg in &self.args {
                argv.list_append(arg.as_str());
            }
            interp.set_variable("argv", argv)?;
            interp.eval_file(path)
        } else {
            interp.set_variable("argv", "")?;
            interp.interactive_prompt()
        };
        interp.resolve_exit(result)
    }
}