Strip serde attributes on aggregate Request and Response types.
This commit is contained in:
parent
dce17dbb64
commit
84562c4260
@ -1,4 +1,5 @@
|
|||||||
use quote::{ToTokens, Tokens};
|
use quote::{ToTokens, Tokens};
|
||||||
|
use syn::{Field, MetaItem};
|
||||||
|
|
||||||
mod metadata;
|
mod metadata;
|
||||||
mod request;
|
mod request;
|
||||||
@ -9,6 +10,27 @@ use self::metadata::Metadata;
|
|||||||
use self::request::Request;
|
use self::request::Request;
|
||||||
use self::response::Response;
|
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)]
|
#[derive(Debug)]
|
||||||
pub struct Api {
|
pub struct Api {
|
||||||
metadata: Metadata,
|
metadata: Metadata,
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
use quote::{ToTokens, Tokens};
|
use quote::{ToTokens, Tokens};
|
||||||
use syn::{Field, MetaItem, NestedMetaItem};
|
use syn::{Field, MetaItem, NestedMetaItem};
|
||||||
|
|
||||||
|
use api::strip_serde_attrs;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Request {
|
pub struct Request {
|
||||||
fields: Vec<RequestField>,
|
fields: Vec<RequestField>,
|
||||||
@ -134,7 +136,7 @@ impl ToTokens for Request {
|
|||||||
fn to_tokens(&self, mut tokens: &mut Tokens) {
|
fn to_tokens(&self, mut tokens: &mut Tokens) {
|
||||||
tokens.append(quote! {
|
tokens.append(quote! {
|
||||||
/// Data for a request to this API endpoint.
|
/// Data for a request to this API endpoint.
|
||||||
#[derive(Debug, Serialize)]
|
#[derive(Debug)]
|
||||||
pub struct Request
|
pub struct Request
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -144,7 +146,8 @@ impl ToTokens for Request {
|
|||||||
tokens.append("{");
|
tokens.append("{");
|
||||||
|
|
||||||
for request_field in self.fields.iter() {
|
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(",");
|
tokens.append(",");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
use quote::{ToTokens, Tokens};
|
use quote::{ToTokens, Tokens};
|
||||||
use syn::{Field, MetaItem, NestedMetaItem};
|
use syn::{Field, MetaItem, NestedMetaItem};
|
||||||
|
|
||||||
|
use api::strip_serde_attrs;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Response {
|
pub struct Response {
|
||||||
fields: Vec<ResponseField>,
|
fields: Vec<ResponseField>,
|
||||||
@ -153,12 +155,8 @@ impl ToTokens for Response {
|
|||||||
} else {
|
} else {
|
||||||
tokens.append("{");
|
tokens.append("{");
|
||||||
|
|
||||||
for response in self.fields.iter() {
|
for response_field in self.fields.iter() {
|
||||||
match *response {
|
strip_serde_attrs(response_field.field()).to_tokens(&mut tokens);
|
||||||
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),
|
|
||||||
}
|
|
||||||
|
|
||||||
tokens.append(",");
|
tokens.append(",");
|
||||||
}
|
}
|
||||||
@ -197,6 +195,14 @@ pub enum ResponseField {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl 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 {
|
fn is_body(&self) -> bool {
|
||||||
match *self {
|
match *self {
|
||||||
ResponseField::Body(_) => true,
|
ResponseField::Body(_) => true,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user