http_serde_ext/
request.rs

1use std::mem;
2
3use http::{request::Builder, HeaderMap, Method, Uri, Version};
4use serde::{de, Deserialize, Serialize};
5
6type Type<T> = http::Request<T>;
7const STRUCT_NAME: &str = "Request";
8
9#[derive(Serialize)]
10struct BorrowedHead<'a> {
11    #[serde(with = "crate::method")]
12    method: &'a Method,
13    #[serde(with = "crate::uri")]
14    uri: &'a Uri,
15    #[serde(with = "crate::header_map")]
16    headers: &'a HeaderMap,
17    #[serde(with = "crate::version")]
18    version: Version,
19}
20
21impl<'a, T> From<&'a Type<T>> for BorrowedHead<'a> {
22    fn from(val: &'a Type<T>) -> Self {
23        Self {
24            method: val.method(),
25            uri: val.uri(),
26            headers: val.headers(),
27            version: val.version(),
28        }
29    }
30}
31
32#[derive(Deserialize)]
33struct Head {
34    #[serde(with = "crate::method")]
35    method: Method,
36    #[serde(with = "crate::uri")]
37    uri: Uri,
38    #[serde(with = "crate::header_map")]
39    headers: HeaderMap,
40    #[serde(with = "crate::version")]
41    version: Version,
42}
43
44impl Head {
45    fn try_into_with_body<T, E>(mut self, body: T) -> Result<Type<T>, E>
46    where
47        E: de::Error,
48    {
49        let mut builder = Builder::new()
50            .method(self.method)
51            .uri(self.uri)
52            .version(self.version);
53
54        if let Some(headers) = builder.headers_mut() {
55            mem::swap(&mut self.headers, headers);
56        } else {
57            return Err(de::Error::custom("builder doesn't have headers"));
58        }
59
60        builder.body(body).map_err(de::Error::custom)
61    }
62}
63
64serde_request_response!(Type<T>, STRUCT_NAME, Head, BorrowedHead);
65
66derive_extension_types!(super::Type<T>, T);