git.delta.rocks / jrsonnet / refs/commits / 66a4ff89da1a

difftreelog

source

crates/jrsonnet-stdlib/src/objects.rs3.8 KiBsourcehistory
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	// Standard implementation uses std.objectFields without such argument, we can't164	// assume order preservation should always be enabled/disabled165	#[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}