Reorganize DeriveInput
diff --git a/codegen/src/main.rs b/codegen/src/main.rs
index 606e113..935ce01 100644
--- a/codegen/src/main.rs
+++ b/codegen/src/main.rs
@@ -22,7 +22,7 @@
 extern crate syn;
 
 use quote::{ToTokens, Tokens};
-use syn::{Attribute, Body, BodyStruct, DeriveInput, Ident, Item};
+use syn::{Attribute, Data, DataStruct, DeriveInput, Ident, Item};
 use failure::{err_msg, Error};
 
 use std::io::{Read, Write};
@@ -158,8 +158,8 @@
                             vis: item.vis,
                             attrs: item.attrs,
                             generics: item.generics,
-                            body: Body::Struct(BodyStruct {
-                                data: item.data,
+                            data: Data::Struct(DataStruct {
+                                fields: item.fields,
                                 struct_token: item.struct_token,
                                 semi_token: item.semi_token,
                             }),
@@ -273,13 +273,13 @@
             keyword!(pub) >>
             keyword!(enum) >>
             id: syn!(Ident) >>
-            body: braces!(many0!(eos_variant)) >>
+            variants: braces!(many0!(eos_variant)) >>
             option!(syn!(Ident)) >> // do_not_generate_to_tokens
             ({
                 // XXX: This is really gross - we shouldn't have to convert the
                 // tokens to strings to re-parse them.
                 let enum_item = {
-                    let variants = body.1.iter().map(|v| {
+                    let variants = variants.1.iter().map(|v| {
                         let name = v.name;
                         match v.member {
                             Some(ref member) => quote!(#name(#member)),
@@ -295,7 +295,7 @@
                     features: quote!(),
                     eos_full:  false,
                 }];
-                items.extend(body.1.into_iter().filter_map(|v| v.inner));
+                items.extend(variants.1.into_iter().filter_map(|v| v.inner));
                 AstEnumOfStructs(items)
             })
         ));
@@ -725,21 +725,21 @@
         ));
 
         // XXX:  This part is a disaster - I'm not sure how to make it cleaner though :'(
-        match s.ast.body {
-            Body::Enum(ref e) => {
+        match s.ast.data {
+            Data::Enum(ref e) => {
                 state.visit_impl.push_str("    match *_i {\n");
                 state.visit_mut_impl.push_str("    match *_i {\n");
                 state.fold_impl.push_str("    match _i {\n");
                 for variant in &e.variants {
-                    let fields: Vec<(&Field, Tokens)> = match variant.item().data {
-                        VariantData::Struct(..) => panic!("Doesn't support enum struct variants"),
-                        VariantData::Tuple(_, ref fields) => {
+                    let fields: Vec<(&Field, Tokens)> = match variant.item().fields {
+                        Fields::Named(..) => panic!("Doesn't support enum struct variants"),
+                        Fields::Unnamed(ref fields) => {
                             let binding = format!("        {}::{}(", s.ast.ident, variant.item().ident);
                             state.visit_impl.push_str(&binding);
                             state.visit_mut_impl.push_str(&binding);
                             state.fold_impl.push_str(&binding);
 
-                            let res = fields
+                            let res = fields.fields
                                 .iter()
                                 .enumerate()
                                 .map(|(idx, el)| {
@@ -768,7 +768,7 @@
 
                             res
                         }
-                        VariantData::Unit => {
+                        Fields::Unit => {
                             state
                                 .visit_impl
                                 .push_str(&format!("        {0}::{1} => {{ }}\n", s.ast.ident, variant.item().ident));
@@ -836,13 +836,13 @@
                 state.visit_mut_impl.push_str("    }\n");
                 state.fold_impl.push_str("    }\n");
             }
-            Body::Struct(ref v) => {
-                let fields: Vec<(&Field, Tokens)> = match v.data {
-                    VariantData::Struct(_, ref fields) => {
+            Data::Struct(ref v) => {
+                let fields: Vec<(&Field, Tokens)> = match v.fields {
+                    Fields::Named(ref fields) => {
                         state
                             .fold_impl
                             .push_str(&format!("    {} {{\n", s.ast.ident));
-                        fields
+                        fields.fields
                             .iter()
                             .map(|el| {
                                 let id = el.item().ident;
@@ -850,11 +850,11 @@
                             })
                             .collect()
                     }
-                    VariantData::Tuple(_, ref fields) => {
+                    Fields::Unnamed(ref fields) => {
                         state
                             .fold_impl
                             .push_str(&format!("    {} (\n", s.ast.ident));
-                        fields
+                        fields.fields
                             .iter()
                             .enumerate()
                             .map(|(idx, el)| {
@@ -863,7 +863,7 @@
                             })
                             .collect()
                     }
-                    VariantData::Unit => {
+                    Fields::Unit => {
                         state.fold_impl.push_str("    _i\n");
                         vec![]
                     }
@@ -901,12 +901,13 @@
                     }
                 }
 
-                match v.data {
-                    VariantData::Struct(..) => state.fold_impl.push_str("    }\n"),
-                    VariantData::Tuple(..) => state.fold_impl.push_str("    )\n"),
-                    VariantData::Unit => {}
+                match v.fields {
+                    Fields::Named(..) => state.fold_impl.push_str("    }\n"),
+                    Fields::Unnamed(..) => state.fold_impl.push_str("    )\n"),
+                    Fields::Unit => {}
                 };
             }
+            Data::Union(..) => panic!("Union not supported"),
         }
 
         // Close the impl body
@@ -939,8 +940,8 @@
                     }),
                     attrs: vec![],
                     generics: Default::default(),
-                    body: Body::Struct(BodyStruct {
-                        data: VariantData::Unit,
+                    data: Data::Struct(DataStruct {
+                        fields: Fields::Unit,
                         struct_token: Default::default(),
                         semi_token: None,
                     }),