use anyhow::Result;
use clap::Parser;
use crate::{eval, model, query};
#[derive(Parser, Clone, Debug)]
#[command(author, about, long_about)]
pub struct EvalOptions {
#[arg(long, short = 'D')]
define: Vec<String>,
expr: String,
tree: Option<String>,
garden: Option<String>,
}
pub fn main(app_context: &model::ApplicationContext, eval: &EvalOptions) -> Result<()> {
app_context
.get_root_config_mut()
.apply_defines(&eval.define);
match eval.tree.as_ref() {
None => {
let config = app_context.get_root_config();
let value = eval::value(app_context, config, &eval.expr);
println!("{value}");
}
Some(tree) => {
let garden = eval.garden.as_deref();
let ctx = query::find_tree(app_context, app_context.get_root_id(), tree, garden)?;
let graft_config = ctx.config.map(|graft_id| app_context.get_config(graft_id));
let value = eval::tree_value(
app_context,
app_context.get_root_config(),
graft_config,
&eval.expr,
&ctx.tree,
ctx.garden.as_ref(),
);
println!("{value}");
}
}
Ok(())
}