summaryrefslogtreecommitdiff
path: root/dhall/src
diff options
context:
space:
mode:
authorNadrieril Feneanar2019-11-11 18:30:36 +0100
committerGitHub2019-11-11 18:30:36 +0100
commitbbb089d219cb22751d7100fe6524063cbe2474dd (patch)
tree4c64231fd014215b962cb294d4672d6785326372 /dhall/src
parent84cd6f386d6f4c7952fbc1da87dcd754f26ee404 (diff)
parentfacd2c587d96510c5a808f19d37b40c1fc2d2618 (diff)
Merge pull request #115 from Nadrieril/parse-selection-be-expr
Parse projection by expression
Diffstat (limited to 'dhall/src')
-rw-r--r--dhall/src/phase/binary.rs10
-rw-r--r--dhall/src/phase/normalize.rs1
-rw-r--r--dhall/src/phase/typecheck.rs1
3 files changed, 12 insertions, 0 deletions
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<DecodedExpr, DecodeError> {
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 {