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