1use crate::metadata::MetadataMap;
2
3#[derive(Debug)]
4pub struct Request<T> {
5 metadata: MetadataMap,
6 message: T,
7}
8
9impl<T> Request<T> {
10 pub fn new(message: T) -> Self {
12 Request {
13 metadata: MetadataMap::new(),
14 message,
15 }
16 }
17
18 pub fn get_ref(&self) -> &T {
20 &self.message
21 }
22
23 pub fn get_mut(&mut self) -> &mut T {
25 &mut self.message
26 }
27
28 pub fn metadata(&self) -> &MetadataMap {
30 &self.metadata
31 }
32
33 pub fn metadata_mut(&mut self) -> &mut MetadataMap {
35 &mut self.metadata
36 }
37
38 pub fn into_inner(self) -> T {
40 self.message
41 }
42
43 pub fn from_http(http: http::Request<T>) -> Self {
45 let (head, message) = http.into_parts();
46 Request {
47 metadata: MetadataMap::from_headers(head.headers),
48 message,
49 }
50 }
51
52 pub fn into_http(self, uri: http::Uri) -> http::Request<T> {
53 let mut request = http::Request::new(self.message);
54
55 *request.version_mut() = http::Version::HTTP_2;
56 *request.method_mut() = http::Method::POST;
57 *request.uri_mut() = uri;
58 *request.headers_mut() = self.metadata.into_headers();
59
60 request
61 }
62
63 pub fn map<F, U>(self, f: F) -> Request<U>
64 where
65 F: FnOnce(T) -> U,
66 {
67 let message = f(self.message);
68
69 Request {
70 metadata: self.metadata,
71 message,
72 }
73 }
74}