--- a/crates/jrsonnet-evaluator/src/builtin/mod.rs +++ b/crates/jrsonnet-evaluator/src/builtin/mod.rs @@ -135,6 +135,8 @@ ("asciiLower".into(), builtin_ascii_lower::INST), ("member".into(), builtin_member::INST), ("count".into(), builtin_count::INST), + ("any".into(), builtin_any::INST), + ("all".into(), builtin_all::INST), ].iter().cloned().collect() }; } @@ -668,3 +670,25 @@ } Ok(count) } + +#[jrsonnet_macros::builtin] +fn builtin_any(arr: ArrValue) -> Result { + for v in arr.iter() { + let v: bool = v?.try_into()?; + if v { + return Ok(true); + } + } + Ok(false) +} + +#[jrsonnet_macros::builtin] +fn builtin_all(arr: ArrValue) -> Result { + for v in arr.iter() { + let v: bool = v?.try_into()?; + if !v { + return Ok(false); + } + } + Ok(true) +} --- a/crates/jrsonnet-stdlib/src/std.jsonnet +++ b/crates/jrsonnet-stdlib/src/std.jsonnet @@ -40,6 +40,9 @@ mantissa:: $intrinsic(mantissa), exponent:: $intrinsic(exponent), + any:: $intrinsic(any), + all:: $intrinsic(all), + isString(v):: std.type(v) == 'string', isNumber(v):: std.type(v) == 'number', isBoolean(v):: std.type(v) == 'boolean',