use clap::Parser;
use crate::{Interp, JimObject, JimResult};
use crate::{JimError, sys};
#[derive(Parser, Debug)]
#[command(version)]
pub struct Jimsh {
#[arg(trailing_var_arg = true, allow_hyphen_values = true)]
script: Vec<String>,
}
impl Jimsh {
pub fn run(&self, interp: &Interp) -> JimResult<i32> {
interp.eval_source("initjimsh.tcl", 1, sys::tclexts::initjimsh)?;
let result = if self.script.len() >= 1 {
let path = &self.script[0];
interp.set_variable("argv0", path.as_str())?;
let argv = JimObject::empty(interp);
for arg in &self.script[1..] {
argv.list_append(arg.as_str());
}
interp.set_variable("argv", argv)?;
interp.eval_file(path)
} else {
interp.set_variable("argv", "")?;
interp.interactive_prompt()
};
if let Err(JimError::Error(msg)) = &result {
eprintln!("Tcl script failed: {}", msg);
let stack = interp.stack_trace();
let obj = interp.new_string("stackdump");
obj.list_append(stack);
let result = interp.eval_object(&obj)?;
eprintln!("{}", result);
Ok(1)
} else {
interp.resolve_exit(result)
}
}
}