use crate::ast::{Expr, Ref};
use crate::lexer::Span;
use crate::value::Value;
use anyhow::Result;
use super::helpers::{as_string, is_true, is_undefined, resolve_path};
pub(super) fn get_parameter(
_span: &Span,
_params: &[Ref<Expr>],
args: &[Value],
_strict: bool,
) -> Result<Value> {
#[allow(clippy::pattern_type_mismatch)]
let [params_obj, defaults_obj, name] = args
else {
return Ok(Value::Undefined);
};
let val = ¶ms_obj[name];
if !is_undefined(val) {
return Ok(val.clone());
}
Ok(defaults_obj[name].clone())
}
pub(super) fn resolve_field(
_span: &Span,
_params: &[Ref<Expr>],
args: &[Value],
_strict: bool,
) -> Result<Value> {
#[allow(clippy::pattern_type_mismatch)]
let [resource, field_path] = args
else {
return Ok(Value::Undefined);
};
let Some(path) = as_string(field_path) else {
return Ok(Value::Undefined);
};
Ok(resolve_path(resource, &path))
}
pub(super) fn logic_all(
_span: &Span,
_params: &[Ref<Expr>],
args: &[Value],
_strict: bool,
) -> Result<Value> {
Ok(Value::Bool(args.iter().all(is_true)))
}
pub(super) fn logic_any(
_span: &Span,
_params: &[Ref<Expr>],
args: &[Value],
_strict: bool,
) -> Result<Value> {
Ok(Value::Bool(args.iter().any(is_true)))
}
pub(super) fn if_fn(
_span: &Span,
_params: &[Ref<Expr>],
args: &[Value],
_strict: bool,
) -> Result<Value> {
#[allow(clippy::pattern_type_mismatch)]
let [cond, when_true, when_false] = args
else {
return Ok(Value::Undefined);
};
if is_true(cond) {
Ok(when_true.clone())
} else {
Ok(when_false.clone())
}
}