git.delta.rocks / jrsonnet / refs/commits / a51d3e524236

difftreelog

feat impl Typed for BTreeMap

Yaroslav Bolyukin2023-07-27parent: #9567d36.patch.diff
in: master

2 files changed

modifiedcrates/jrsonnet-evaluator/src/typed/conversions.rsdiffbeforeafterboth
347 }347 }
348}348}
349
350impl<K: Typed + Ord, V: Typed> Typed for BTreeMap<K, V> {
351 const TYPE: &'static ComplexValType = &ComplexValType::AttrsOf(V::TYPE);
352
353 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 }
364
365 fn from_untyped(value: Val) -> Result<Self> {
366 Self::TYPE.check(&value)?;
367 let obj = value.as_obj().expect("typecheck should fail");
368
369 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}
349394
350impl Typed for Val {395impl Typed for Val {
351 const TYPE: &'static ComplexValType = &ComplexValType::Any;396 const TYPE: &'static ComplexValType = &ComplexValType::Any;
modifiedcrates/jrsonnet-evaluator/src/typed/mod.rsdiffbeforeafterboth
191 }191 }
192 v => Err(TypeError::ExpectedGot(self.clone(), v.value_type()).into()),192 v => Err(TypeError::ExpectedGot(self.clone(), v.value_type()).into()),
193 },193 },
194 Self::AttrsOf(a) => match value {
195 Val::Obj(o) => {
196 for (_key, value) in o.iter(
197 #[cfg(feature = "exp-preserve-order")]
198 false,
199 ) {
200 let value = value?;
201 a.check(&value)?;
202 }
203 Ok(())
204 }
205 v => Err(TypeError::ExpectedGot(self.clone(), v.value_type()).into()),
206 },
194 Self::ObjectRef(elems) => match value {207 Self::ObjectRef(elems) => match value {
195 Val::Obj(obj) => {208 Val::Obj(obj) => {
196 for (k, v) in elems.iter() {209 for (k, v) in elems.iter() {