summaryrefslogtreecommitdiff
path: root/dhall_generator/src/derive.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/derive.rs
parenta0c36547372db5421704e4c8f17226a25ea57b7a (diff)
Prepare for nullary union variants
Diffstat (limited to '')
-rw-r--r--dhall_generator/src/derive.rs35
1 files changed, 13 insertions, 22 deletions
diff --git a/dhall_generator/src/derive.rs b/dhall_generator/src/derive.rs
index 740081a..852ffc8 100644
--- a/dhall_generator/src/derive.rs
+++ b/dhall_generator/src/derive.rs
@@ -71,35 +71,26 @@ fn derive_for_enum(
.iter()
.map(|v| {
let name = dhall_core::Label::from(v.ident.to_string());
- let ty = match &v.fields {
+ match &v.fields {
+ syn::Fields::Unit => Ok((name, None)),
syn::Fields::Unnamed(fields) if fields.unnamed.is_empty() => {
- Err(Error::new(
- v.span(),
- "Nullary variants are not supported",
- ))
+ Ok((name, None))
}
- syn::Fields::Unnamed(fields) if fields.unnamed.len() > 1 => {
- Err(Error::new(
- v.span(),
- "Variants with more than one field are not supported",
- ))
+ syn::Fields::Unnamed(fields) if fields.unnamed.len() == 1 => {
+ let ty = &fields.unnamed.iter().next().unwrap().ty;
+ constraints.push(ty.clone());
+ let ty = get_simple_static_type(ty);
+ Ok((name, Some(quote!(#ty.into()))))
}
- syn::Fields::Unnamed(fields) => {
- Ok(&fields.unnamed.iter().next().unwrap().ty)
- }
- syn::Fields::Named(_) => Err(Error::new(
+ syn::Fields::Unnamed(_) => Err(Error::new(
v.span(),
- "Named variants are not supported",
+ "Variants with more than one field are not supported",
)),
- syn::Fields::Unit => Err(Error::new(
+ syn::Fields::Named(_) => Err(Error::new(
v.span(),
- "Nullary variants are not supported",
+ "Named variants are not supported",
)),
- };
- let ty = ty?;
- constraints.push(ty.clone());
- let ty = get_simple_static_type(ty);
- Ok((name, quote!(#ty.into())))
+ }
})
.collect::<Result<_, Error>>()?;