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")]