tower_grpc/
request.rs

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    /// Create a new gRPC request
11    pub fn new(message: T) -> Self {
12        Request {
13            metadata: MetadataMap::new(),
14            message,
15        }
16    }
17
18    /// Get a reference to the message
19    pub fn get_ref(&self) -> &T {
20        &self.message
21    }
22
23    /// Get a mutable reference to the message
24    pub fn get_mut(&mut self) -> &mut T {
25        &mut self.message
26    }
27
28    /// Get a reference to the custom request metadata.
29    pub fn metadata(&self) -> &MetadataMap {
30        &self.metadata
31    }
32
33    /// Get a mutable reference to the request metadata.
34    pub fn metadata_mut(&mut self) -> &mut MetadataMap {
35        &mut self.metadata
36    }
37
38    /// Consumes `self`, returning the message
39    pub fn into_inner(self) -> T {
40        self.message
41    }
42
43    /// Convert an HTTP request to a gRPC request
44    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}