#![deny(warnings)]
use gosh_repl::{Actionable, Interpreter};
use gut::cli::*;
use gut::prelude::*;
#[derive(Parser, Debug)]
#[clap(disable_help_subcommand = true)]
enum Cmd {
#[command(name = "quit", alias = "q", alias = "exit")]
Quit {},
#[command(name = "help", alias = "h", alias = "?")]
Help {},
#[command(name = "load")]
Load {
#[clap(name = "FILENAME")]
path: String,
},
}
#[derive(Debug, Default, Clone)]
struct Action {
_state: Option<Vec<String>>,
}
impl Actionable for Action {
type Command = Cmd;
fn act_on(&mut self, cmd: &Cmd) -> Result<bool> {
match cmd {
Cmd::Quit {} => return Ok(true),
Cmd::Help {} => {
let mut app = Cmd::command();
if let Err(err) = app.print_help() {
eprintln!("clap error: {err:?}");
}
println!("");
}
o => {
eprintln!("{:?}: not implemented yet!", o);
}
}
Ok(false)
}
}
mod cli {
#![deny(warnings)]
use super::*;
use std::path::PathBuf;
#[derive(Parser, Debug)]
pub struct ReplCli {
#[clap(short = 'x')]
script_file: Option<PathBuf>,
#[clap(flatten)]
verbose: Verbosity,
}
impl ReplCli {
pub fn enter_main() -> Result<()> {
let args: Vec<String> = std::env::args().collect();
let action = Action::default();
if args.len() > 1 {
let args = Self::parse();
args.verbose.setup_logger();
if let Some(script_file) = &args.script_file {
info!("Execute script file: {:?}", script_file);
Interpreter::new(action).interpret_script_file(script_file)?;
} else {
info!("Reading batch script from stdin ..");
let mut buffer = String::new();
std::io::stdin().read_to_string(&mut buffer)?;
Interpreter::new(action).interpret_script(&buffer)?;
}
} else {
Interpreter::new(action).with_prompt("gosh> ").run()?;
}
Ok(())
}
}
}
fn main() -> Result<()> {
cli::ReplCli::enter_main()?;
Ok(())
}