diff options
author | Nadrieril | 2019-04-16 21:54:32 +0200 |
---|---|---|
committer | Nadrieril | 2019-04-16 21:54:32 +0200 |
commit | d93be73890d0db0d34afaaebd3db1b87d68fb9b7 (patch) | |
tree | fdc485e299d6db37963db1f59e7b8a3daf3aa2ba /dhall/src/binary.rs | |
parent | a0c36547372db5421704e4c8f17226a25ea57b7a (diff) |
Prepare for nullary union variants
Diffstat (limited to 'dhall/src/binary.rs')
-rw-r--r-- | dhall/src/binary.rs | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/dhall/src/binary.rs b/dhall/src/binary.rs index 72704de..c12aa2a 100644 --- a/dhall/src/binary.rs +++ b/dhall/src/binary.rs @@ -143,11 +143,11 @@ fn cbor_value_to_dhall(data: &cbor::Value) -> Result<ParsedExpr, DecodeError> { Field(x, l) } [U64(11), Object(map)] => { - let map = cbor_map_to_dhall_map(map)?; + let map = cbor_map_to_dhall_opt_map(map)?; UnionType(map) } [U64(12), String(l), x, Object(map)] => { - let map = cbor_map_to_dhall_map(map)?; + let map = cbor_map_to_dhall_opt_map(map)?; let x = cbor_value_to_dhall(&x)?; let l = Label::from(l.as_str()); UnionLit(l, x, map) @@ -343,3 +343,21 @@ fn cbor_map_to_dhall_map( }) .collect::<Result<_, _>>() } + +fn cbor_map_to_dhall_opt_map( + map: &std::collections::BTreeMap<cbor::ObjectKey, cbor::Value>, +) -> Result<std::collections::BTreeMap<Label, Option<ParsedExpr>>, DecodeError> +{ + map.iter() + .map(|(k, v)| -> Result<(_, _), _> { + let k = k.as_string().ok_or_else(|| { + DecodeError::WrongFormatError("map/key".to_owned()) + })?; + let v = match v { + cbor::Value::Null => None, + _ => Some(cbor_value_to_dhall(v)?), + }; + Ok((Label::from(k.as_ref()), v)) + }) + .collect::<Result<_, _>>() +} |