Strip serde attributes on aggregate Request and Response types.

This commit is contained in:
Jimmy Cuadra 2017-07-01 15:26:03 -07:00
parent dce17dbb64
commit 84562c4260
3 changed files with 39 additions and 8 deletions

View File

@ -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,

View File

@ -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<RequestField>,
@ -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(",");
}

View File

@ -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<ResponseField>,
@ -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,