difftreelog
feat impl Typed for BTreeMap
in: master
2 files changed
crates/jrsonnet-evaluator/src/typed/conversions.rsdiffbeforeafterboth347 }347 }348}348}349350impl<K: Typed + Ord, V: Typed> Typed for BTreeMap<K, V> {351 const TYPE: &'static ComplexValType = &ComplexValType::AttrsOf(V::TYPE);352353 fn into_untyped(typed: Self) -> Result<Val> {354 let mut out = ObjValueBuilder::with_capacity(typed.len());355 for (k, v) in typed {356 let Some(key) = K::into_untyped(k)?.as_str() else {357 throw!("map key should serialize to string");358 };359 let value = V::into_untyped(v)?;360 out.member(key).value_unchecked(value);361 }362 Ok(Val::Obj(out.build()))363 }364365 fn from_untyped(value: Val) -> Result<Self> {366 Self::TYPE.check(&value)?;367 let obj = value.as_obj().expect("typecheck should fail");368369 let mut out = BTreeMap::new();370 if V::wants_lazy() {371 for key in obj.fields_ex(372 false,373 #[cfg(feature = "exp-preserve-order")]374 false,375 ) {376 let value = obj.get_lazy(key.clone()).expect("field exists");377 let value = V::from_lazy_untyped(value)?;378 let key = K::from_untyped(Val::Str(key.into()))?;379 let _ = out.insert(key, value);380 }381 } else {382 for (key, value) in obj.iter(383 #[cfg(feature = "exp-preserve-order")]384 false,385 ) {386 let key = K::from_untyped(Val::Str(key.into()))?;387 let value = V::from_untyped(value?)?;388 let _ = out.insert(key, value);389 }390 }391 Ok(out)392 }393}349394350impl Typed for Val {395impl Typed for Val {351 const TYPE: &'static ComplexValType = &ComplexValType::Any;396 const TYPE: &'static ComplexValType = &ComplexValType::Any;crates/jrsonnet-evaluator/src/typed/mod.rsdiffbeforeafterboth--- a/crates/jrsonnet-evaluator/src/typed/mod.rs
+++ b/crates/jrsonnet-evaluator/src/typed/mod.rs
@@ -191,6 +191,19 @@
}
v => Err(TypeError::ExpectedGot(self.clone(), v.value_type()).into()),
},
+ Self::AttrsOf(a) => match value {
+ Val::Obj(o) => {
+ for (_key, value) in o.iter(
+ #[cfg(feature = "exp-preserve-order")]
+ false,
+ ) {
+ let value = value?;
+ a.check(&value)?;
+ }
+ Ok(())
+ }
+ v => Err(TypeError::ExpectedGot(self.clone(), v.value_type()).into()),
+ },
Self::ObjectRef(elems) => match value {
Val::Obj(obj) => {
for (k, v) in elems.iter() {