Rename macro input to derive input
diff --git a/src/derive.rs b/src/derive.rs
new file mode 100644
index 0000000..bc43e40
--- /dev/null
+++ b/src/derive.rs
@@ -0,0 +1,110 @@
+use super::*;
+
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub struct DeriveInput {
+ pub ident: Ident,
+ pub vis: Visibility,
+ pub attrs: Vec<Attribute>,
+ pub generics: Generics,
+ pub body: Body,
+}
+
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub enum Body {
+ Enum(Vec<Variant>),
+ Struct(VariantData),
+}
+
+#[cfg(feature = "parsing")]
+pub mod parsing {
+ use super::*;
+ use Generics;
+ use attr::parsing::outer_attr;
+ use data::parsing::{visibility, struct_body, enum_body};
+ use generics::parsing::generics;
+ use ident::parsing::ident;
+
+ named!(pub derive_input -> DeriveInput, do_parse!(
+ attrs: many0!(outer_attr) >>
+ vis: visibility >>
+ which: alt!(keyword!("struct") | keyword!("enum")) >>
+ id: ident >>
+ generics: generics >>
+ item: switch!(value!(which),
+ "struct" => map!(struct_body, move |(wh, body)| DeriveInput {
+ ident: id,
+ vis: vis,
+ attrs: attrs,
+ generics: Generics {
+ where_clause: wh,
+ .. generics
+ },
+ body: Body::Struct(body),
+ })
+ |
+ "enum" => map!(enum_body, move |(wh, body)| DeriveInput {
+ ident: id,
+ vis: vis,
+ attrs: attrs,
+ generics: Generics {
+ where_clause: wh,
+ .. generics
+ },
+ body: Body::Enum(body),
+ })
+ ) >>
+ (item)
+ ));
+}
+
+#[cfg(feature = "printing")]
+mod printing {
+ use super::*;
+ use attr::FilterAttrs;
+ use data::VariantData;
+ use quote::{Tokens, ToTokens};
+
+ impl ToTokens for DeriveInput {
+ fn to_tokens(&self, tokens: &mut Tokens) {
+ for attr in self.attrs.outer() {
+ attr.to_tokens(tokens);
+ }
+ self.vis.to_tokens(tokens);
+ match self.body {
+ Body::Enum(_) => tokens.append("enum"),
+ Body::Struct(_) => tokens.append("struct"),
+ }
+ self.ident.to_tokens(tokens);
+ self.generics.to_tokens(tokens);
+ match self.body {
+ Body::Enum(ref variants) => {
+ self.generics.where_clause.to_tokens(tokens);
+ tokens.append("{");
+ for variant in variants {
+ variant.to_tokens(tokens);
+ tokens.append(",");
+ }
+ tokens.append("}");
+ }
+ Body::Struct(ref variant_data) => {
+ match *variant_data {
+ VariantData::Struct(_) => {
+ self.generics.where_clause.to_tokens(tokens);
+ variant_data.to_tokens(tokens);
+ // no semicolon
+ }
+ VariantData::Tuple(_) => {
+ variant_data.to_tokens(tokens);
+ self.generics.where_clause.to_tokens(tokens);
+ tokens.append(";");
+ }
+ VariantData::Unit => {
+ self.generics.where_clause.to_tokens(tokens);
+ tokens.append(";");
+ }
+ }
+ }
+ }
+ }
+ }
+}