Add support for header fields in responses.
This commit is contained in:
parent
c0c4b0949a
commit
dce17dbb64
@ -145,7 +145,7 @@ impl ToTokens for Api {
|
|||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
tokens.append(".and_then(|response_body| {");
|
tokens.append(".and_then(move |response_body| {");
|
||||||
|
|
||||||
tokens
|
tokens
|
||||||
} else if self.response.has_body_fields() {
|
} 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
|
tokens
|
||||||
} else {
|
} else {
|
||||||
@ -175,7 +175,7 @@ impl ToTokens for Api {
|
|||||||
let future_response = ::futures::future::ok(())
|
let future_response = ::futures::future::ok(())
|
||||||
});
|
});
|
||||||
|
|
||||||
tokens.append(".and_then(|_| {");
|
tokens.append(".and_then(move |_| {");
|
||||||
|
|
||||||
tokens
|
tokens
|
||||||
};
|
};
|
||||||
@ -183,6 +183,14 @@ impl ToTokens for Api {
|
|||||||
let mut closure_end = Tokens::new();
|
let mut closure_end = Tokens::new();
|
||||||
closure_end.append("});");
|
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() {
|
let response_init_fields = if self.response.has_fields() {
|
||||||
self.response.init_fields()
|
self.response.init_fields()
|
||||||
} else {
|
} else {
|
||||||
@ -239,6 +247,8 @@ impl ToTokens for Api {
|
|||||||
#[allow(unused_variables)]
|
#[allow(unused_variables)]
|
||||||
fn future_from(hyper_response: ::hyper::Response)
|
fn future_from(hyper_response: ::hyper::Response)
|
||||||
-> Box<_Future<Item = Self, Error = Self::Error>> {
|
-> Box<_Future<Item = Self, Error = Self::Error>> {
|
||||||
|
#extract_headers
|
||||||
|
|
||||||
#deserialize_response_body
|
#deserialize_response_body
|
||||||
|
|
||||||
let response = Response {
|
let response = Response {
|
||||||
|
@ -15,6 +15,10 @@ impl Response {
|
|||||||
self.fields.len() != 0
|
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 {
|
pub fn init_fields(&self) -> Tokens {
|
||||||
let mut tokens = Tokens::new();
|
let mut tokens = Tokens::new();
|
||||||
|
|
||||||
@ -31,11 +35,11 @@ impl Response {
|
|||||||
ResponseField::Header(ref field) => {
|
ResponseField::Header(ref field) => {
|
||||||
let field_name = field.ident.as_ref()
|
let field_name = field.ident.as_ref()
|
||||||
.expect("expected body field to have a name");
|
.expect("expected body field to have a name");
|
||||||
|
let field_type = &field.ty;
|
||||||
|
|
||||||
tokens.append(quote! {
|
tokens.append(quote! {
|
||||||
#field_name: hyper_response.headers()
|
#field_name: headers.remove::<#field_type>()
|
||||||
.get_raw(#field_name)
|
.expect("missing expected request header"),
|
||||||
.expect("missing expected request header: {}", #field_name),
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
ResponseField::NewtypeBody(ref field) => {
|
ResponseField::NewtypeBody(ref field) => {
|
||||||
@ -140,7 +144,7 @@ impl ToTokens for Response {
|
|||||||
fn to_tokens(&self, mut tokens: &mut Tokens) {
|
fn to_tokens(&self, mut tokens: &mut Tokens) {
|
||||||
tokens.append(quote! {
|
tokens.append(quote! {
|
||||||
/// Data in the response from this API endpoint.
|
/// Data in the response from this API endpoint.
|
||||||
#[derive(Debug, Deserialize)]
|
#[derive(Debug)]
|
||||||
pub struct Response
|
pub struct Response
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -199,6 +203,13 @@ impl ResponseField {
|
|||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn is_header(&self) -> bool {
|
||||||
|
match *self {
|
||||||
|
ResponseField::Header(_) => true,
|
||||||
|
_ => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum ResponseFieldKind {
|
enum ResponseFieldKind {
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
#![deny(missing_debug_implementations)]
|
#![deny(missing_debug_implementations)]
|
||||||
#![feature(proc_macro)]
|
#![feature(proc_macro)]
|
||||||
#![recursion_limit="128"]
|
#![recursion_limit="256"]
|
||||||
|
|
||||||
extern crate proc_macro;
|
extern crate proc_macro;
|
||||||
#[macro_use] extern crate quote;
|
#[macro_use] extern crate quote;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user