use crate::{
Result,
engine::{
eval,
exec::{Action, Exec, Output, VarId},
},
};
use toasty_core::driver::Rows;
#[derive(Debug)]
pub(crate) struct Eval {
pub(crate) inputs: Vec<VarId>,
pub(crate) output: Output,
pub(crate) eval: eval::Func,
}
impl Exec<'_> {
pub(super) async fn action_eval(&mut self, action: &Eval) -> Result<()> {
let mut input = Vec::with_capacity(action.inputs.len());
for var_id in &action.inputs {
let data = self.vars.load(*var_id).await?.collect_as_value().await?;
input.push(data);
}
let result = action.eval.eval(&input)?;
self.vars.store(
action.output.var,
action.output.num_uses,
Rows::Value(result),
);
Ok(())
}
}
impl From<Eval> for Action {
fn from(value: Eval) -> Self {
Action::Eval(value)
}
}