Add newtype body fields to the hyper request.

This commit is contained in:
Jimmy Cuadra 2017-05-19 05:58:04 -07:00
parent 90c3654254
commit 58fab938b0
2 changed files with 28 additions and 19 deletions

View File

@ -32,7 +32,15 @@ impl ToTokens for Api {
tokens
};
let add_body_to_request = if self.request.has_body_fields() {
let add_body_to_request = if let Some(field) = self.request.newtype_body_field() {
let field_name = field.ident.as_ref().expect("expected body field to have a name");
quote! {
let request_body = RequestBody(request.#field_name);
hyper_request.set_body(::serde_json::to_vec(&request_body)?);
}
} else if self.request.has_body_fields() {
let request_body_init_fields = self.request.request_body_init_fields();
quote! {

View File

@ -11,6 +11,20 @@ impl Request {
self.fields.iter().any(|field| field.is_body())
}
pub fn newtype_body_field(&self) -> Option<&Field> {
for request_field in self.fields.iter() {
match *request_field {
RequestField::NewtypeBody(ref field) => {
return Some(field);
}
_ => continue,
}
}
None
}
pub fn request_body_init_fields(&self) -> Tokens {
let mut tokens = Tokens::new();
@ -33,23 +47,6 @@ impl Request {
fn body_fields(&self) -> RequestBodyFields {
RequestBodyFields::new(&self.fields)
}
fn newtype_body_field(&self) -> Option<Field> {
for request_field in self.fields.iter() {
match *request_field {
RequestField::NewtypeBody(ref field) => {
let mut newtype_field = field.clone();
newtype_field.ident = None;
return Some(newtype_field);
}
_ => continue,
}
}
None
}
}
impl From<Vec<Field>> for Request {
@ -153,6 +150,10 @@ impl ToTokens for Request {
}
if let Some(newtype_body_field) = self.newtype_body_field() {
let mut field = newtype_body_field.clone();
field.ident = None;
tokens.append(quote! {
/// Data in the request body.
#[derive(Debug, Serialize)]
@ -161,7 +162,7 @@ impl ToTokens for Request {
tokens.append("(");
newtype_body_field.to_tokens(&mut tokens);
field.to_tokens(&mut tokens);
tokens.append(");");
} else if self.has_body_fields() {