diff options
author | Aspen Smith <root@gws.fyi> | 2024-02-09T17·59-0500 |
---|---|---|
committer | aspen <root@gws.fyi> | 2024-02-09T19·11+0000 |
commit | 3fb0697a713cdd5b0c22b3c511419ba3a281746a (patch) | |
tree | 4cc88884ea59a3da8d9fcfcdf7e1110757b260d0 /tvix/eval/src/value/attrs | |
parent | 7a589b3ec67e49edc6de1d3378db1c4c594210f1 (diff) |
fix(tvix/eval): Propagate catchables in NixAttrs::construct r/7492
Correctly propagate the case where the *key* of an attrset is a Value::Catchable (eg { "${builtins.throw "c"}" = "b"; }) in `NixAttrs::construct`, by converting the return type to `Result<Result<Self, CatchableErrorKind>, ErrorKind>` (ugh!!) and correctly handling that everywhere (including an `expect` in the Deserialize impl for NixAttrs, since afaict this is impossible to hit when deserializing from stuff like JSON). Change-Id: Ic4bc611fbfdab27c0bd8a40759689a87c4004a17 Reviewed-on: https://cl.tvl.fyi/c/depot/+/10786 Reviewed-by: raitobezarius <tvl@lahfa.xyz> Tested-by: BuildkiteCI
Diffstat (limited to 'tvix/eval/src/value/attrs')
-rw-r--r-- | tvix/eval/src/value/attrs/tests.rs | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/tvix/eval/src/value/attrs/tests.rs b/tvix/eval/src/value/attrs/tests.rs index d7e2f113ebdf..534b78a00d10 100644 --- a/tvix/eval/src/value/attrs/tests.rs +++ b/tvix/eval/src/value/attrs/tests.rs @@ -4,7 +4,9 @@ use super::*; #[test] fn test_empty_attrs() { - let attrs = NixAttrs::construct(0, vec![]).expect("empty attr construction should succeed"); + let attrs = NixAttrs::construct(0, vec![]) + .expect("empty attr construction should succeed") + .unwrap(); assert!( matches!(attrs, NixAttrs(AttrsRep::Empty)), @@ -15,7 +17,8 @@ fn test_empty_attrs() { #[test] fn test_simple_attrs() { let attrs = NixAttrs::construct(1, vec![Value::from("key"), Value::from("value")]) - .expect("simple attr construction should succeed"); + .expect("simple attr construction should succeed") + .unwrap(); assert!( matches!(attrs, NixAttrs(AttrsRep::Im(_))), @@ -39,7 +42,8 @@ fn test_kv_attrs() { meaning_val.clone(), ], ) - .expect("constructing K/V pair attrs should succeed"); + .expect("constructing K/V pair attrs should succeed") + .unwrap(); match kv_attrs { NixAttrs(AttrsRep::KV { name, value }) @@ -55,7 +59,7 @@ fn test_kv_attrs() { #[test] fn test_empty_attrs_iter() { - let attrs = NixAttrs::construct(0, vec![]).unwrap(); + let attrs = NixAttrs::construct(0, vec![]).unwrap().unwrap(); assert!(attrs.iter().next().is_none()); } @@ -75,7 +79,8 @@ fn test_kv_attrs_iter() { meaning_val.clone(), ], ) - .expect("constructing K/V pair attrs should succeed"); + .expect("constructing K/V pair attrs should succeed") + .unwrap(); let mut iter = kv_attrs.iter().collect::<Vec<_>>().into_iter(); let (k, v) = iter.next().unwrap(); @@ -90,7 +95,8 @@ fn test_kv_attrs_iter() { #[test] fn test_map_attrs_iter() { let attrs = NixAttrs::construct(1, vec![Value::from("key"), Value::from("value")]) - .expect("simple attr construction should succeed"); + .expect("simple attr construction should succeed") + .unwrap(); let mut iter = attrs.iter().collect::<Vec<_>>().into_iter(); let (k, v) = iter.next().unwrap(); |