1use ::http::{Error, Method, Request as HttpRequest};
2pub use hyper;
3use hyper::body::Body;
4use restless_core::{Encodable, Request};
5
6#[derive(thiserror::Error, Debug)]
8pub enum HyperRequestError {
9 #[error(transparent)]
10 Body(#[from] Error),
11}
12
13pub trait HyperRequest {
15 fn to_hyper_request_prefix(&self, prefix: &str)
17 -> Result<HttpRequest<Body>, HyperRequestError>;
18
19 fn to_hyper_request(&self) -> Result<HttpRequest<Body>, HyperRequestError> {
21 self.to_hyper_request_prefix("/")
22 }
23}
24
25fn to_hyper_request<T: Request>(
26 request: &T,
27 prefix: &str,
28) -> Result<HttpRequest<Body>, HyperRequestError> {
29 let builder = HttpRequest::builder()
30 .uri(&format!("{prefix}{}", request.uri()))
31 .method::<Method>(request.method().into());
32 let body = request.body();
33 let builder = match body.content_type() {
34 Some(content_type) => builder.header("content-type", &*content_type),
35 None => builder,
36 };
37 let request = builder.body::<Body>(request.body().encode_bytes().into())?;
38 Ok(request)
39}
40
41impl<T: Request> HyperRequest for T {
42 fn to_hyper_request_prefix(
43 &self,
44 prefix: &str,
45 ) -> Result<HttpRequest<Body>, HyperRequestError> {
46 to_hyper_request(self, prefix)
47 }
48}