Add support for header fields in responses.

This commit is contained in:
Jimmy Cuadra 2017-07-01 11:29:23 -07:00
parent c0c4b0949a
commit dce17dbb64
3 changed files with 29 additions and 8 deletions

View File

@ -145,7 +145,7 @@ impl ToTokens for Api {
})
});
tokens.append(".and_then(|response_body| {");
tokens.append(".and_then(move |response_body| {");
tokens
} else if self.response.has_body_fields() {
@ -165,7 +165,7 @@ impl ToTokens for Api {
})
});
tokens.append(".and_then(|response_body| {");
tokens.append(".and_then(move |response_body| {");
tokens
} else {
@ -175,7 +175,7 @@ impl ToTokens for Api {
let future_response = ::futures::future::ok(())
});
tokens.append(".and_then(|_| {");
tokens.append(".and_then(move |_| {");
tokens
};
@ -183,6 +183,14 @@ impl ToTokens for Api {
let mut closure_end = Tokens::new();
closure_end.append("});");
let extract_headers = if self.response.has_header_fields() {
quote! {
let mut headers = hyper_response.headers().clone();
}
} else {
Tokens::new()
};
let response_init_fields = if self.response.has_fields() {
self.response.init_fields()
} else {
@ -239,6 +247,8 @@ impl ToTokens for Api {
#[allow(unused_variables)]
fn future_from(hyper_response: ::hyper::Response)
-> Box<_Future<Item = Self, Error = Self::Error>> {
#extract_headers
#deserialize_response_body
let response = Response {

View File

@ -15,6 +15,10 @@ impl Response {
self.fields.len() != 0
}
pub fn has_header_fields(&self) -> bool {
self.fields.iter().any(|field| field.is_header())
}
pub fn init_fields(&self) -> Tokens {
let mut tokens = Tokens::new();
@ -31,11 +35,11 @@ impl Response {
ResponseField::Header(ref field) => {
let field_name = field.ident.as_ref()
.expect("expected body field to have a name");
let field_type = &field.ty;
tokens.append(quote! {
#field_name: hyper_response.headers()
.get_raw(#field_name)
.expect("missing expected request header: {}", #field_name),
#field_name: headers.remove::<#field_type>()
.expect("missing expected request header"),
});
}
ResponseField::NewtypeBody(ref field) => {
@ -140,7 +144,7 @@ impl ToTokens for Response {
fn to_tokens(&self, mut tokens: &mut Tokens) {
tokens.append(quote! {
/// Data in the response from this API endpoint.
#[derive(Debug, Deserialize)]
#[derive(Debug)]
pub struct Response
});
@ -199,6 +203,13 @@ impl ResponseField {
_ => false,
}
}
fn is_header(&self) -> bool {
match *self {
ResponseField::Header(_) => true,
_ => false,
}
}
}
enum ResponseFieldKind {

View File

@ -2,7 +2,7 @@
#![deny(missing_debug_implementations)]
#![feature(proc_macro)]
#![recursion_limit="128"]
#![recursion_limit="256"]
extern crate proc_macro;
#[macro_use] extern crate quote;