use std::io::{self, Write};
use ikigai_engine::{Action, CacheStats, Engine, HELP};
pub fn run_commands(engine: Engine, commands: &[String]) -> i32 {
let mut code = 0;
let mut total = CacheStats::default();
let mut ran = 0u32;
for command in commands {
match engine.eval(command) {
Action::Output(entry) => {
match &entry.result {
Ok(output) => println!("{output}"),
Err(err) => {
eprintln!("error: {err}");
code = 1;
}
}
if let Some(label) = entry.cache.label() {
eprintln!("[{label}]");
}
total.merge(entry.cache);
ran += 1;
}
Action::Help => println!("{HELP}"),
Action::Clear => {}
Action::Quit => break,
Action::Noop => {}
}
}
if ran > 1 {
if let Some(label) = total.label() {
eprintln!("— batch: {ran} commands · {label}");
}
}
code
}
pub fn run(engine: Engine) {
println!(
"ikigai {} — REPL. Type `help`, or `quit` to exit.",
env!("CARGO_PKG_VERSION")
);
let stdin = io::stdin();
let mut line = String::new();
loop {
print!("ikigai> ");
io::stdout().flush().ok();
line.clear();
if stdin.read_line(&mut line).unwrap_or(0) == 0 {
println!();
break; }
match engine.eval(&line) {
Action::Quit => break,
Action::Help => println!("{HELP}"),
Action::Clear => {
print!("\x1b[2J\x1b[H");
io::stdout().flush().ok();
}
Action::Output(entry) => {
match &entry.result {
Ok(out) => println!("{out}"),
Err(err) => eprintln!("error: {err}"),
}
if let Some(label) = entry.cache.label() {
eprintln!("[{label}]");
}
}
Action::Noop => {}
}
}
}