mod cli;
mod error;
mod executor;
mod node;
mod ops;
mod output;
mod renderer;
mod session;
mod show;
use clap::Parser;
use cli::{Cli, Command};
fn main() {
let cli = Cli::parse();
if let Err(e) = run(cli) {
eprintln!("ropt: error: {e:#}");
std::process::exit(1);
}
}
fn run(cli: Cli) -> error::Result<()> {
match cli.command {
Command::Begin => {
let session_id = session::begin()?;
println!("{session_id}");
}
Command::End(args) => {
let session_id = session::resolve_session_id(args.session.as_deref())?;
session::end(&session_id)?;
}
Command::Push(args) => {
ops::push(&args)?;
}
Command::Append(args) => {
ops::append(&args)?;
}
Command::Pop(args) => {
let session_id = session::resolve_session_id(args.session.as_deref())?;
ops::pop(&session_id)?;
}
Command::Execute(args) => {
let session_id = session::resolve_session_id(args.session.as_deref())?;
executor::execute(&session_id)?;
let state = session::read_state(&session_id)?;
output::write_results(&state.results, &args.format, &args.prefix)?;
}
Command::Read(args) => {
let session_id = session::resolve_session_id(args.session.as_deref())?;
let state = session::read_state(&session_id)?;
let value = state.results.get(&args.key).ok_or_else(|| {
anyhow::anyhow!(error::RoptError::ResultNotFound(args.key.clone()))
})?;
println!("{value}");
}
Command::Show(args) => {
let session_id = session::resolve_session_id(args.session.as_deref())?;
show::show(&session_id, &args.format)?;
}
}
Ok(())
}