http_serde_ext/
request.rs1use 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);