From facd2c587d96510c5a808f19d37b40c1fc2d2618 Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Mon, 11 Nov 2019 17:20:48 +0000 Subject: Parse projection by expression --- dhall/src/phase/binary.rs | 10 ++++++++++ dhall/src/phase/normalize.rs | 1 + dhall/src/phase/typecheck.rs | 1 + 3 files changed, 12 insertions(+) (limited to 'dhall/src/phase') diff --git a/dhall/src/phase/binary.rs b/dhall/src/phase/binary.rs index b4f18da..464d71a 100644 --- a/dhall/src/phase/binary.rs +++ b/dhall/src/phase/binary.rs @@ -181,6 +181,15 @@ fn cbor_value_to_dhall(data: &cbor::Value) -> Result { let l = Label::from(l.as_str()); Field(x, l) } + [U64(10), x, Array(arr)] => { + let x = cbor_value_to_dhall(&x)?; + if let [y] = arr.as_slice() { + let y = cbor_value_to_dhall(&y)?; + ProjectionByExpr(x, y) + } else { + Err(DecodeError::WrongFormatError("projection-by-expr".to_owned()))? + } + } [U64(10), x, rest @ ..] => { let x = cbor_value_to_dhall(&x)?; let labels = rest @@ -577,6 +586,7 @@ where .chain(once(expr(x))) .chain(ls.iter().map(label)), ), + ProjectionByExpr(x, y) => ser_seq!(ser; tag(10), expr(x), vec![expr(y)]), Import(import) => serialize_import(ser, import), Embed(_) => unimplemented!( "An expression with resolved imports cannot be binary-encoded" diff --git a/dhall/src/phase/normalize.rs b/dhall/src/phase/normalize.rs index 0992f74..ae1aefe 100644 --- a/dhall/src/phase/normalize.rs +++ b/dhall/src/phase/normalize.rs @@ -738,6 +738,7 @@ pub(crate) fn normalize_one_layer( } } } + ExprF::ProjectionByExpr(_, _) => unimplemented!("selection by expression"), ExprF::Merge(ref handlers, ref variant, _) => { let handlers_borrow = handlers.as_whnf(); diff --git a/dhall/src/phase/typecheck.rs b/dhall/src/phase/typecheck.rs index 33919e4..265a20e 100644 --- a/dhall/src/phase/typecheck.rs +++ b/dhall/src/phase/typecheck.rs @@ -787,6 +787,7 @@ fn type_last_layer( record_type.get_type()?, )) } + ProjectionByExpr(_, _) => unimplemented!("selection by expression"), }; Ok(match ret { -- cgit v1.2.3