use crate::{ExecutionError, FunctionContext, ResolveResult, Value};
use cel_parser::Expression;
pub trait Resolver {
fn resolve(&self, ctx: &FunctionContext) -> ResolveResult;
}
impl Resolver for Expression {
fn resolve(&self, ctx: &FunctionContext) -> ResolveResult {
Value::resolve(self, ctx.ptx)
}
}
pub(crate) struct Argument(pub usize);
impl Resolver for Argument {
fn resolve(&self, ctx: &FunctionContext) -> ResolveResult {
let index = self.0;
let arg = ctx
.args
.get(index)
.ok_or(ExecutionError::invalid_argument_count(
index + 1,
ctx.args.len(),
))?;
Value::resolve(arg, ctx.ptx)
}
}
pub(crate) struct AllArguments;
impl Resolver for AllArguments {
fn resolve(&self, ctx: &FunctionContext) -> ResolveResult {
let mut args = Vec::with_capacity(ctx.args.len());
for arg in ctx.args.iter() {
args.push(Value::resolve(arg, ctx.ptx)?);
}
Ok(Value::List(args.into()))
}
}