volo_grpc/
request.rs

1//! These codes are copied from `tonic/src/request.rs` and may be modified by us.
2
3use std::fmt::Debug;
4
5use futures::prelude::*;
6use http::Extensions;
7
8use crate::metadata::MetadataMap;
9
10#[derive(Debug)]
11pub struct Request<T> {
12    metadata: MetadataMap,
13    message: T,
14    extensions: Extensions,
15}
16
17impl<T> Request<T> {
18    /// Create a new [`Request`].
19    pub fn new(message: T) -> Self {
20        Self {
21            metadata: MetadataMap::new(),
22            message,
23            extensions: Extensions::new(),
24        }
25    }
26
27    /// Get a reference to the message
28    pub fn get_ref(&self) -> &T {
29        &self.message
30    }
31
32    /// Get a mutable reference to the message
33    pub fn get_mut(&mut self) -> &mut T {
34        &mut self.message
35    }
36
37    /// Get a reference to the custom request metadata.
38    pub fn metadata(&self) -> &MetadataMap {
39        &self.metadata
40    }
41
42    /// Get a mutable reference to the request metadata.
43    pub fn metadata_mut(&mut self) -> &mut MetadataMap {
44        &mut self.metadata
45    }
46
47    /// Consumes `self`, returning the message
48    pub fn into_inner(self) -> T {
49        self.message
50    }
51
52    pub fn into_parts(self) -> (MetadataMap, Extensions, T) {
53        (self.metadata, self.extensions, self.message)
54    }
55
56    pub fn from_parts(metadata: MetadataMap, extensions: Extensions, message: T) -> Self {
57        Self {
58            metadata,
59            extensions,
60            message,
61        }
62    }
63
64    pub fn from_http(http: http::Request<T>) -> Self {
65        let (parts, message) = http.into_parts();
66        Self::from_http_parts(parts, message)
67    }
68
69    pub fn from_http_parts(parts: http::request::Parts, message: T) -> Self {
70        Self {
71            metadata: MetadataMap::from_headers(parts.headers),
72            message,
73            extensions: parts.extensions,
74        }
75    }
76
77    /// Returns a reference to the associated extensions.
78    pub fn extensions(&self) -> &Extensions {
79        &self.extensions
80    }
81
82    /// Returns a mutable reference to the associated extensions.
83    pub fn extensions_mut(&mut self) -> &mut Extensions {
84        &mut self.extensions
85    }
86
87    #[doc(hidden)]
88    pub fn map<F, U>(self, f: F) -> Request<U>
89    where
90        F: FnOnce(T) -> U,
91    {
92        let message = f(self.message);
93
94        Request {
95            metadata: self.metadata,
96            message,
97            extensions: self.extensions,
98        }
99    }
100}
101
102pub trait IntoRequest<T>: sealed::Sealed {
103    /// Wrap the input message `T` in a `volo_grpc::Request`
104    fn into_request(self) -> Request<T>;
105}
106
107impl<T> IntoRequest<T> for T {
108    fn into_request(self) -> Request<Self> {
109        Request::new(self)
110    }
111}
112
113impl<T> IntoRequest<T> for Request<T> {
114    fn into_request(self) -> Self {
115        self
116    }
117}
118
119pub trait IntoStreamingRequest: sealed::Sealed {
120    /// The RPC request stream type
121    type Stream: Stream<Item = Self::Message> + Send + Sync + 'static;
122
123    /// The RPC request type
124    type Message;
125
126    /// Wrap the stream of messages in a `volo_grpc::Request`
127    fn into_streaming_request(self) -> Request<Self::Stream>;
128}
129
130impl<T> IntoStreamingRequest for T
131where
132    T: Stream + Send + Sync + 'static,
133{
134    type Stream = T;
135    type Message = T::Item;
136
137    fn into_streaming_request(self) -> Request<Self> {
138        Request::new(self)
139    }
140}
141
142impl<T> IntoStreamingRequest for Request<T>
143where
144    T: Stream + Send + Sync + 'static,
145{
146    type Stream = T;
147    type Message = T::Item;
148
149    fn into_streaming_request(self) -> Self {
150        self
151    }
152}
153
154impl<T> sealed::Sealed for T {}
155
156mod sealed {
157    pub trait Sealed {}
158}