summaryrefslogtreecommitdiff
path: root/dhall_generator/src/quote.rs
diff options
context:
space:
mode:
authorNadrieril2019-04-16 21:54:32 +0200
committerNadrieril2019-04-16 21:54:32 +0200
commitd93be73890d0db0d34afaaebd3db1b87d68fb9b7 (patch)
treefdc485e299d6db37963db1f59e7b8a3daf3aa2ba /dhall_generator/src/quote.rs
parenta0c36547372db5421704e4c8f17226a25ea57b7a (diff)
Prepare for nullary union variants
Diffstat (limited to '')
-rw-r--r--dhall_generator/src/quote.rs59
1 files changed, 41 insertions, 18 deletions
diff --git a/dhall_generator/src/quote.rs b/dhall_generator/src/quote.rs
index 89107a9..c335666 100644
--- a/dhall_generator/src/quote.rs
+++ b/dhall_generator/src/quote.rs
@@ -31,23 +31,6 @@ pub fn quote_exprf<TS>(expr: ExprF<TS, Label, X, X>) -> TokenStream
where
TS: quote::ToTokens + std::fmt::Debug,
{
- let quote_map = |m: BTreeMap<Label, TS>| -> TokenStream {
- let entries = m.into_iter().map(|(k, v)| {
- let k = quote_label(&k);
- quote!(m.insert(#k, #v);)
- });
- quote! { {
- use std::collections::BTreeMap;
- let mut m = BTreeMap::new();
- #( #entries )*
- m
- } }
- };
-
- let quote_vec = |e: Vec<TS>| -> TokenStream {
- quote! { vec![ #(#e),* ] }
- };
-
use dhall_core::ExprF::*;
match expr {
Var(_) => unreachable!(),
@@ -106,7 +89,7 @@ where
quote! { dhall_core::ExprF::RecordLit(#m) }
}
UnionType(m) => {
- let m = quote_map(m);
+ let m = quote_opt_map(m);
quote! { dhall_core::ExprF::UnionType(#m) }
}
e => unimplemented!("{:?}", e),
@@ -206,3 +189,43 @@ fn quote_label(l: &Label) -> TokenStream {
fn rc(x: TokenStream) -> TokenStream {
quote! { dhall_core::rc(#x) }
}
+
+fn quote_opt<TS>(x: Option<TS>) -> TokenStream
+where
+ TS: quote::ToTokens + std::fmt::Debug,
+{
+ match x {
+ Some(x) => quote!(Some(#x)),
+ None => quote!(None),
+ }
+}
+
+fn quote_vec<TS>(e: Vec<TS>) -> TokenStream
+where
+ TS: quote::ToTokens + std::fmt::Debug,
+{
+ quote! { vec![ #(#e),* ] }
+}
+
+fn quote_map<TS>(m: BTreeMap<Label, TS>) -> TokenStream
+where
+ TS: quote::ToTokens + std::fmt::Debug,
+{
+ let entries = m.into_iter().map(|(k, v)| {
+ let k = quote_label(&k);
+ quote!(m.insert(#k, #v);)
+ });
+ quote! { {
+ use std::collections::BTreeMap;
+ let mut m = BTreeMap::new();
+ #( #entries )*
+ m
+ } }
+}
+
+fn quote_opt_map<TS>(m: BTreeMap<Label, Option<TS>>) -> TokenStream
+where
+ TS: quote::ToTokens + std::fmt::Debug,
+{
+ quote_map(m.into_iter().map(|(k, v)| (k, quote_opt(v))).collect())
+}