From 84562c426044eef6b1c2f0e964e85ff9d100aa27 Mon Sep 17 00:00:00 2001 From: Jimmy Cuadra Date: Sat, 1 Jul 2017 15:26:03 -0700 Subject: [PATCH] Strip serde attributes on aggregate Request and Response types. --- src/api/mod.rs | 22 ++++++++++++++++++++++ src/api/request.rs | 7 +++++-- src/api/response.rs | 18 ++++++++++++------ 3 files changed, 39 insertions(+), 8 deletions(-) diff --git a/src/api/mod.rs b/src/api/mod.rs index 53cacbe3..8ed40e76 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -1,4 +1,5 @@ use quote::{ToTokens, Tokens}; +use syn::{Field, MetaItem}; mod metadata; mod request; @@ -9,6 +10,27 @@ use self::metadata::Metadata; use self::request::Request; use self::response::Response; +pub fn strip_serde_attrs(field: &Field) -> Field { + let mut field = field.clone(); + + field.attrs = field.attrs.into_iter().filter(|attr| { + let (attr_ident, _) = match attr.value { + MetaItem::List(ref attr_ident, _) => { + (attr_ident, ()) + } + _ => return true, + }; + + if attr_ident != "serde" { + return true; + } + + false + }).collect(); + + field +} + #[derive(Debug)] pub struct Api { metadata: Metadata, diff --git a/src/api/request.rs b/src/api/request.rs index 92e55e54..be9729b4 100644 --- a/src/api/request.rs +++ b/src/api/request.rs @@ -1,6 +1,8 @@ use quote::{ToTokens, Tokens}; use syn::{Field, MetaItem, NestedMetaItem}; +use api::strip_serde_attrs; + #[derive(Debug)] pub struct Request { fields: Vec, @@ -134,7 +136,7 @@ impl ToTokens for Request { fn to_tokens(&self, mut tokens: &mut Tokens) { tokens.append(quote! { /// Data for a request to this API endpoint. - #[derive(Debug, Serialize)] + #[derive(Debug)] pub struct Request }); @@ -144,7 +146,8 @@ impl ToTokens for Request { tokens.append("{"); for request_field in self.fields.iter() { - request_field.field().to_tokens(&mut tokens); + strip_serde_attrs(request_field.field()).to_tokens(&mut tokens); + tokens.append(","); } diff --git a/src/api/response.rs b/src/api/response.rs index 591341b0..5a203e13 100644 --- a/src/api/response.rs +++ b/src/api/response.rs @@ -1,6 +1,8 @@ use quote::{ToTokens, Tokens}; use syn::{Field, MetaItem, NestedMetaItem}; +use api::strip_serde_attrs; + #[derive(Debug)] pub struct Response { fields: Vec, @@ -153,12 +155,8 @@ impl ToTokens for Response { } else { tokens.append("{"); - for response in self.fields.iter() { - match *response { - ResponseField::Body(ref field) => field.to_tokens(&mut tokens), - ResponseField::Header(ref field) => field.to_tokens(&mut tokens), - ResponseField::NewtypeBody(ref field) => field.to_tokens(&mut tokens), - } + for response_field in self.fields.iter() { + strip_serde_attrs(response_field.field()).to_tokens(&mut tokens); tokens.append(","); } @@ -197,6 +195,14 @@ pub enum ResponseField { } impl ResponseField { + fn field(&self) -> &Field { + match *self { + ResponseField::Body(ref field) => field, + ResponseField::Header(ref field) => field, + ResponseField::NewtypeBody(ref field) => field, + } + } + fn is_body(&self) -> bool { match *self { ResponseField::Body(_) => true,