1use 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 pub fn new(message: T) -> Self {
20 Self {
21 metadata: MetadataMap::new(),
22 message,
23 extensions: Extensions::new(),
24 }
25 }
26
27 pub fn get_ref(&self) -> &T {
29 &self.message
30 }
31
32 pub fn get_mut(&mut self) -> &mut T {
34 &mut self.message
35 }
36
37 pub fn metadata(&self) -> &MetadataMap {
39 &self.metadata
40 }
41
42 pub fn metadata_mut(&mut self) -> &mut MetadataMap {
44 &mut self.metadata
45 }
46
47 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 pub fn extensions(&self) -> &Extensions {
79 &self.extensions
80 }
81
82 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 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 type Stream: Stream<Item = Self::Message> + Send + Sync + 'static;
122
123 type Message;
125
126 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}