use super::{Expanded, Processor};
use crate::cel::{self, Program, Values};
use crate::diagnostic::{Code, Diagnostic};
use crate::lines::LineStarts;
use crate::md::Signatures;
use crate::validate::scope::Scope;
impl Processor<Expanded> {
pub fn evaluate(&self, expression: &str) -> Result<serde_json::Value, Box<Diagnostic>> {
let validated = &self.state.validated;
let resolved = &validated.resolved;
let main = resolved.main;
let settings = &resolved.document(main).settings;
let context = &self.state.render.context;
let failed = |error: cel::Error| {
let at = LineStarts::new(expression).location(error.at());
Box::new(Diagnostic::new(Code::F024, at, error.message()).in_stage(error.stage()))
};
let program = Program::parse(expression).map_err(failed)?;
program
.check(&Scope::body(resolved, main).cel(), &Signatures)
.map_err(failed)?;
let md = context
.md(settings)
.data(self.state.data.data(main))
.input(&self.state.data.inputs);
let values = Values::default().with("md", md.into());
let value = program
.evaluate(&values, &context.functions(settings))
.map_err(failed)?;
Ok(value.to_json())
}
}