Replace Vec<u8> by hyper::Body

The `hyper::Request` and `Response` used in *ruma-client* require a type
parameter that implements `hyper::body::Payload`, but no implementation
for `Vec<u8>` is provided by a crate. Therefore, the best is to use
`hyper::Body` in the macros.
This commit is contained in:
Jörg Sommer 2018-08-25 16:06:28 +02:00
parent adf785ffc9
commit 8703e515a9
4 changed files with 33 additions and 16 deletions

View File

@ -25,6 +25,7 @@ features = ["nightly"]
[dev-dependencies] [dev-dependencies]
futures = "0.1.21" futures = "0.1.21"
http = "0.1.5" http = "0.1.5"
hyper = "0.12"
serde = "1.0.57" serde = "1.0.57"
serde_derive = "1.0.57" serde_derive = "1.0.57"
serde_json = "1.0.17" serde_json = "1.0.17"

View File

@ -143,7 +143,7 @@ impl ToTokens for Api {
quote! { quote! {
let request_body = RequestBody(request.#field_name); let request_body = RequestBody(request.#field_name);
let mut http_request = ::http::Request::new(::serde_json::to_vec(&request_body)?); let mut http_request = ::http::Request::new(::serde_json::to_vec(&request_body)?.into());
} }
} else if self.request.has_body_fields() { } else if self.request.has_body_fields() {
let request_body_init_fields = self.request.request_body_init_fields(); let request_body_init_fields = self.request.request_body_init_fields();
@ -153,11 +153,11 @@ impl ToTokens for Api {
#request_body_init_fields #request_body_init_fields
}; };
let mut http_request = ::http::Request::new(::serde_json::to_vec(&request_body)?); let mut http_request = ::http::Request::new(::serde_json::to_vec(&request_body)?.into());
} }
} else { } else {
quote! { quote! {
let mut http_request = ::http::Request::new(Vec::with_capacity(0)); let mut http_request = ::http::Request::new(::hyper::Body::empty());
} }
}; };
@ -165,17 +165,31 @@ impl ToTokens for Api {
let field_type = &field.ty; let field_type = &field.ty;
quote! { quote! {
let future_response = let future_response = http_response.into_body()
::serde_json::from_slice::<#field_type>(http_response.body().as_slice()) .fold(Vec::new(), |mut vec, chunk| {
.into_future() vec.extend(chunk.iter());
.map_err(::ruma_api::Error::from) ::futures::future::ok::<_, ::hyper::Error>(vec)
})
.map_err(::ruma_api::Error::from)
.and_then(|data|
::serde_json::from_slice::<#field_type>(data.as_slice())
.map_err(::ruma_api::Error::from)
.into_future()
)
} }
} else if self.response.has_body_fields() { } else if self.response.has_body_fields() {
quote! { quote! {
let future_response = let future_response = http_response.into_body()
::serde_json::from_slice::<ResponseBody>(http_response.body().as_slice()) .fold(Vec::new(), |mut vec, chunk| {
.into_future() vec.extend(chunk.iter());
.map_err(::ruma_api::Error::from) ::futures::future::ok::<_, ::hyper::Error>(vec)
})
.map_err(::ruma_api::Error::from)
.and_then(|data|
::serde_json::from_slice::<ResponseBody>(data.as_slice())
.map_err(::ruma_api::Error::from)
.into_future()
)
} }
} else { } else {
quote! { quote! {
@ -199,7 +213,7 @@ impl ToTokens for Api {
tokens.append_all(quote! { tokens.append_all(quote! {
#[allow(unused_imports)] #[allow(unused_imports)]
use ::futures::{Future as _Future, IntoFuture as _IntoFuture}; use ::futures::{Future as _Future, IntoFuture as _IntoFuture, Stream as _Stream};
use ::ruma_api::Endpoint as _RumaApiEndpoint; use ::ruma_api::Endpoint as _RumaApiEndpoint;
/// The API endpoint. /// The API endpoint.
@ -208,7 +222,7 @@ impl ToTokens for Api {
#request_types #request_types
impl ::std::convert::TryFrom<Request> for ::http::Request<Vec<u8>> { impl ::std::convert::TryFrom<Request> for ::http::Request<::hyper::Body> {
type Error = ::ruma_api::Error; type Error = ::ruma_api::Error;
#[allow(unused_mut, unused_variables)] #[allow(unused_mut, unused_variables)]
@ -236,12 +250,12 @@ impl ToTokens for Api {
#response_types #response_types
impl ::futures::future::FutureFrom<::http::Response<Vec<u8>>> for Response { impl ::futures::future::FutureFrom<::http::Response<::hyper::Body>> for Response {
type Future = Box<_Future<Item = Self, Error = Self::Error>>; type Future = Box<_Future<Item = Self, Error = Self::Error>>;
type Error = ::ruma_api::Error; type Error = ::ruma_api::Error;
#[allow(unused_variables)] #[allow(unused_variables)]
fn future_from(http_response: ::http::Response<Vec<u8>>) fn future_from(http_response: ::http::Response<::hyper::Body>)
-> Box<_Future<Item = Self, Error = Self::Error>> { -> Box<_Future<Item = Self, Error = Self::Error>> {
if http_response.status().is_success() { if http_response.status().is_success() {
#extract_headers #extract_headers
@ -262,7 +276,7 @@ impl ToTokens for Api {
} }
} }
impl ::ruma_api::Endpoint<Vec<u8>, Vec<u8>> for Endpoint { impl ::ruma_api::Endpoint for Endpoint {
type Request = Request; type Request = Request;
type Response = Response; type Response = Response;

View File

@ -125,6 +125,7 @@ mod api;
/// ///
/// extern crate futures; /// extern crate futures;
/// extern crate http; /// extern crate http;
/// extern crate hyper;
/// extern crate ruma_api; /// extern crate ruma_api;
/// extern crate ruma_api_macros; /// extern crate ruma_api_macros;
/// extern crate serde; /// extern crate serde;

View File

@ -2,6 +2,7 @@
extern crate futures; extern crate futures;
extern crate http; extern crate http;
extern crate hyper;
extern crate ruma_api; extern crate ruma_api;
extern crate ruma_api_macros; extern crate ruma_api_macros;
extern crate serde; extern crate serde;