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