restless_hyper/
lib.rs

1use ::http::{Error, Method, Request as HttpRequest};
2pub use hyper;
3use hyper::body::Body;
4use restless_core::{Encodable, Request};
5
6/// Error turning a restless [`Request`] into a hyper [`Request`](http::Request).
7#[derive(thiserror::Error, Debug)]
8pub enum HyperRequestError {
9    #[error(transparent)]
10    Body(#[from] Error),
11}
12
13/// Turn a restless [`Request`] into a hyper [`Request`](http::Request).
14pub trait HyperRequest {
15    /// Turn into hyper request with a custom prefix.
16    fn to_hyper_request_prefix(&self, prefix: &str)
17        -> Result<HttpRequest<Body>, HyperRequestError>;
18
19    /// Turn into hyper request using `/` as the prefix.
20    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}