1use jrsonnet_evaluator::{2 function::builtin,3 rustc_hash::FxHashSet,4 val::{ArrValue, Val},5 IStr, MaybeUnbound, ObjValue, ObjValueBuilder, Thunk,6};78#[builtin]9pub fn builtin_object_fields_ex(10 obj: ObjValue,11 hidden: bool,1213 #[default(false)]14 #[cfg(feature = "exp-preserve-order")]15 preserve_order: bool,16) -> Vec<Val> {17 let out = obj.fields_ex(18 hidden,19 #[cfg(feature = "exp-preserve-order")]20 preserve_order,21 );22 out.into_iter().map(Val::string).collect::<Vec<_>>()23}2425#[builtin]26pub fn builtin_object_fields(27 o: ObjValue,2829 #[default(false)]30 #[cfg(feature = "exp-preserve-order")]31 preserve_order: bool,32) -> Vec<Val> {33 builtin_object_fields_ex(34 o,35 false,36 #[cfg(feature = "exp-preserve-order")]37 preserve_order,38 )39}4041#[builtin]42pub fn builtin_object_fields_all(43 o: ObjValue,4445 #[default(false)]46 #[cfg(feature = "exp-preserve-order")]47 preserve_order: bool,48) -> Vec<Val> {49 builtin_object_fields_ex(50 o,51 true,52 #[cfg(feature = "exp-preserve-order")]53 preserve_order,54 )55}5657pub fn builtin_object_values_ex(58 o: ObjValue,59 include_hidden: bool,6061 #[cfg(feature = "exp-preserve-order")] preserve_order: bool,62) -> ArrValue {63 o.values_ex(64 include_hidden,65 #[cfg(feature = "exp-preserve-order")]66 preserve_order,67 )68}69#[builtin]70pub fn builtin_object_values(71 o: ObjValue,7273 #[default(false)]74 #[cfg(feature = "exp-preserve-order")]75 preserve_order: bool,76) -> ArrValue {77 builtin_object_values_ex(78 o,79 false,80 #[cfg(feature = "exp-preserve-order")]81 preserve_order,82 )83}84#[builtin]85pub fn builtin_object_values_all(86 o: ObjValue,8788 #[default(false)]89 #[cfg(feature = "exp-preserve-order")]90 preserve_order: bool,91) -> ArrValue {92 builtin_object_values_ex(93 o,94 true,95 #[cfg(feature = "exp-preserve-order")]96 preserve_order,97 )98}99100pub fn builtin_object_keys_values_ex(101 o: ObjValue,102 include_hidden: bool,103104 #[cfg(feature = "exp-preserve-order")] preserve_order: bool,105) -> ArrValue {106 o.key_values_ex(107 include_hidden,108 #[cfg(feature = "exp-preserve-order")]109 preserve_order,110 )111}112#[builtin]113pub fn builtin_object_keys_values(114 o: ObjValue,115116 #[default(false)]117 #[cfg(feature = "exp-preserve-order")]118 preserve_order: bool,119) -> ArrValue {120 builtin_object_keys_values_ex(121 o,122 false,123 #[cfg(feature = "exp-preserve-order")]124 preserve_order,125 )126}127#[builtin]128pub fn builtin_object_keys_values_all(129 o: ObjValue,130131 #[default(false)]132 #[cfg(feature = "exp-preserve-order")]133 preserve_order: bool,134) -> ArrValue {135 builtin_object_keys_values_ex(136 o,137 true,138 #[cfg(feature = "exp-preserve-order")]139 preserve_order,140 )141}142143#[builtin]144pub fn builtin_object_has_ex(obj: ObjValue, fname: IStr, hidden: bool) -> bool {145 obj.has_field_ex(fname, hidden)146}147148#[builtin]149pub fn builtin_object_has(o: ObjValue, f: IStr) -> bool {150 o.has_field(f)151}152153#[builtin]154pub fn builtin_object_has_all(o: ObjValue, f: IStr) -> bool {155 o.has_field_include_hidden(f)156}157158#[builtin]159pub fn builtin_object_remove_key(160 obj: ObjValue,161 key: IStr,162163 164 165 #[default(false)]166 #[cfg(feature = "exp-preserve-order")]167 preserve_order: bool,168) -> ObjValue {169 let mut new_obj = ObjValueBuilder::with_capacity(obj.len() - 1);170 let all_fields = obj.fields_ex(171 true,172 #[cfg(feature = "exp-preserve-order")]173 preserve_order,174 );175 let visible_fields = obj176 .fields_ex(177 false,178 #[cfg(feature = "exp-preserve-order")]179 preserve_order,180 )181 .into_iter()182 .collect::<FxHashSet<_>>();183184 for field in &all_fields {185 if *field == key {186 continue;187 }188 let mut b = new_obj.field(field.clone());189 if !visible_fields.contains(&field) {190 b = b.hide();191 }192 let _ = b.binding(MaybeUnbound::Bound(Thunk::result(193 obj.get(field.clone()).transpose().expect("field exists"),194 )));195 }196197 new_obj.build()198}