--- a/crates/jrsonnet-stdlib/src/compat.rs +++ b/crates/jrsonnet-stdlib/src/compat.rs @@ -1,6 +1,8 @@ use std::cmp::Ordering; -use jrsonnet_evaluator::{function::builtin, operator::evaluate_compare_op, Result, Val}; +use jrsonnet_evaluator::{ + function::builtin, operator::evaluate_compare_op, val::ArrValue, Result, Val, +}; #[builtin] #[allow(non_snake_case)] @@ -13,3 +15,34 @@ }, ) } + +#[builtin] +#[allow(non_snake_case)] +pub fn builtin___compare_array(arr1: ArrValue, arr2: ArrValue) -> Result { + builtin___compare(Val::Arr(arr1), Val::Arr(arr2)) +} + +macro_rules! arr_comp { + ($name:ident, $operator:expr) => { + #[builtin] + #[allow(non_snake_case)] + pub fn $name(arr1: ArrValue, arr2: ArrValue) -> Result { + let ordering = evaluate_compare_op( + &Val::Arr(arr1), + &Val::Arr(arr2), + jrsonnet_parser::BinaryOpType::Lt, + )?; + Ok($operator.contains(&ordering)) + } + }; +} +arr_comp!(builtin___array_less, [Ordering::Less]); +arr_comp!(builtin___array_greater, [Ordering::Greater]); +arr_comp!( + builtin___array_less_or_equal, + [Ordering::Less, Ordering::Equal] +); +arr_comp!( + builtin___array_greater_or_equal, + [Ordering::Greater, Ordering::Equal] +); --- a/crates/jrsonnet-stdlib/src/lib.rs +++ b/crates/jrsonnet-stdlib/src/lib.rs @@ -219,6 +219,14 @@ ("regexQuoteMeta", builtin_regex_quote_meta::INST), // Compat ("__compare", builtin___compare::INST), + ("__compare_array", builtin___compare_array::INST), + ("__array_less", builtin___array_less::INST), + ("__array_greater", builtin___array_greater::INST), + ("__array_less_or_equal", builtin___array_less_or_equal::INST), + ( + "__array_greater_or_equal", + builtin___array_greater_or_equal::INST, + ), ] .iter() .copied() --- a/crates/jrsonnet-stdlib/src/std.jsonnet +++ b/crates/jrsonnet-stdlib/src/std.jsonnet @@ -89,13 +89,4 @@ error 'find second parameter should be an array, got ' + std.type(arr) else std.filter(function(i) arr[i] == value, std.range(0, std.length(arr) - 1)), - - // Compat - __compare_array(arr1, arr2):: - assert std.isArray(arr1) && std.isArray(arr2); - std.__compare(arr1, arr2), - __array_less(arr1, arr2):: std.__compare_array(arr1, arr2) == -1, - __array_greater(arr1, arr2):: std.__compare_array(arr1, arr2) == 1, - __array_less_or_equal(arr1, arr2):: std.__compare_array(arr1, arr2) <= 0, - __array_greater_or_equal(arr1, arr2):: std.__compare_array(arr1, arr2) >= 0, }