Parse unions in a DeriveInput
diff --git a/src/derive.rs b/src/derive.rs
index 0fffff1..3bf125c 100644
--- a/src/derive.rs
+++ b/src/derive.rs
@@ -81,19 +81,31 @@
use synom::Synom;
+ enum DeriveInputKind {
+ Struct(Token![struct]),
+ Enum(Token![enum]),
+ Union(Token![union]),
+ }
+
+ impl Synom for DeriveInputKind {
+ named!(parse -> Self, alt!(
+ keyword!(struct) => { DeriveInputKind::Struct }
+ |
+ keyword!(enum) => { DeriveInputKind::Enum }
+ |
+ keyword!(union) => { DeriveInputKind::Union }
+ ));
+ }
+
impl Synom for DeriveInput {
named!(parse -> Self, do_parse!(
attrs: many0!(Attribute::parse_outer) >>
vis: syn!(Visibility) >>
- which: alt!(
- keyword!(struct) => { Ok }
- |
- keyword!(enum) => { Err }
- ) >>
+ which: syn!(DeriveInputKind) >>
id: syn!(Ident) >>
generics: syn!(Generics) >>
item: switch!(value!(which),
- Ok(s) => map!(data_struct, move |(wh, fields, semi)| DeriveInput {
+ DeriveInputKind::Struct(s) => map!(data_struct, move |(wh, fields, semi)| DeriveInput {
ident: id,
vis: vis,
attrs: attrs,
@@ -108,7 +120,7 @@
}),
})
|
- Err(e) => map!(data_enum, move |(wh, brace, variants)| DeriveInput {
+ DeriveInputKind::Enum(e) => map!(data_enum, move |(wh, brace, variants)| DeriveInput {
ident: id,
vis: vis,
attrs: attrs,
@@ -122,6 +134,20 @@
enum_token: e,
}),
})
+ |
+ DeriveInputKind::Union(u) => map!(data_union, move |(wh, fields)| DeriveInput {
+ ident: id,
+ vis: vis,
+ attrs: attrs,
+ generics: Generics {
+ where_clause: wh,
+ ..generics
+ },
+ data: Data::Union(DataUnion {
+ union_token: u,
+ fields: fields,
+ }),
+ })
) >>
(item)
));
@@ -157,6 +183,11 @@
data: braces!(Punctuated::parse_terminated) >>
(wh, data.0, data.1)
));
+
+ named!(data_union -> (Option<WhereClause>, FieldsNamed), tuple!(
+ option!(syn!(WhereClause)),
+ syn!(FieldsNamed)
+ ));
}
#[cfg(feature = "printing")]