cyfs_lib/router_handler/
request.rs

1use super::action::*;
2use crate::*;
3use cyfs_base::*;
4
5use serde_json::{Map, Value};
6use std::fmt;
7
8pub struct RouterHandlerRequest<REQ, RESP>
9where
10    REQ: Send + Sync + 'static + JsonCodec<REQ> + fmt::Display,
11    RESP: Send + Sync + 'static + JsonCodec<RESP> + fmt::Display,
12{
13    pub request: REQ,
14    pub response: Option<BuckyResult<RESP>>,
15}
16
17impl<REQ, RESP> fmt::Display for RouterHandlerRequest<REQ, RESP>
18where
19    REQ: Send + Sync + 'static + JsonCodec<REQ> + fmt::Display,
20    RESP: Send + Sync + 'static + JsonCodec<RESP> + fmt::Display,
21{
22    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
23        write!(f, "request: {}", self.request)?;
24
25        if let Some(resp) = &self.response {
26            match resp {
27                Ok(v) => write!(f, ", response: {}", v)?,
28                Err(e) => write!(f, ", response error: {}", e)?,
29            }
30        }
31
32        Ok(())
33    }
34}
35
36pub struct RouterHandlerResponse<REQ, RESP>
37where
38    REQ: Send + Sync + 'static + JsonCodec<REQ> + fmt::Display,
39    RESP: Send + Sync + 'static + JsonCodec<RESP> + fmt::Display,
40{
41    pub action: RouterHandlerAction,
42    pub request: Option<REQ>,
43    pub response: Option<BuckyResult<RESP>>,
44}
45
46impl<REQ, RESP> fmt::Display for RouterHandlerResponse<REQ, RESP>
47where
48    REQ: Send + Sync + 'static + JsonCodec<REQ> + fmt::Display,
49    RESP: Send + Sync + 'static + JsonCodec<RESP> + fmt::Display,
50{
51    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
52        write!(f, "action: {}", self.action)?;
53
54        if let Some(req) = &self.request {
55            write!(f, ", request: {}", req)?;
56        }
57
58        if let Some(resp) = &self.response {
59            match resp {
60                Ok(v) => write!(f, ", response: {}", v)?,
61                Err(e) => write!(f, ", response error: {}", e)?,
62            }
63        }
64
65        Ok(())
66    }
67}
68
69// request
70pub type RouterHandlerPutObjectRequest =
71    RouterHandlerRequest<NONPutObjectInputRequest, NONPutObjectInputResponse>;
72pub type RouterHandlerGetObjectRequest =
73    RouterHandlerRequest<NONGetObjectInputRequest, NONGetObjectInputResponse>;
74pub type RouterHandlerPostObjectRequest =
75    RouterHandlerRequest<NONPostObjectInputRequest, NONPostObjectInputResponse>;
76pub type RouterHandlerSelectObjectRequest =
77    RouterHandlerRequest<NONSelectObjectInputRequest, NONSelectObjectInputResponse>;
78pub type RouterHandlerDeleteObjectRequest =
79    RouterHandlerRequest<NONDeleteObjectInputRequest, NONDeleteObjectInputResponse>;
80
81pub type RouterHandlerPutDataRequest =
82    RouterHandlerRequest<NDNPutDataInputRequest, NDNPutDataInputResponse>;
83pub type RouterHandlerGetDataRequest =
84    RouterHandlerRequest<NDNGetDataInputRequest, NDNGetDataInputResponse>;
85pub type RouterHandlerDeleteDataRequest =
86    RouterHandlerRequest<NDNDeleteDataInputRequest, NDNDeleteDataInputResponse>;
87
88pub type RouterHandlerSignObjectRequest =
89    RouterHandlerRequest<CryptoSignObjectInputRequest, CryptoSignObjectInputResponse>;
90pub type RouterHandlerVerifyObjectRequest =
91    RouterHandlerRequest<CryptoVerifyObjectInputRequest, CryptoVerifyObjectInputResponse>;
92pub type RouterHandlerEncryptDataRequest =
93    RouterHandlerRequest<CryptoEncryptDataInputRequest, CryptoEncryptDataInputResponse>;
94pub type RouterHandlerDecryptDataRequest =
95    RouterHandlerRequest<CryptoDecryptDataInputRequest, CryptoDecryptDataInputResponse>;
96
97pub type RouterHandlerAclRequest =
98    RouterHandlerRequest<AclHandlerRequest, AclHandlerResponse>;
99
100pub type RouterHandlerInterestRequest = 
101    RouterHandlerRequest<InterestHandlerRequest, InterestHandlerResponse>;
102
103// response
104pub type RouterHandlerPutObjectResult =
105    RouterHandlerResponse<NONPutObjectInputRequest, NONPutObjectInputResponse>;
106pub type RouterHandlerGetObjectResult =
107    RouterHandlerResponse<NONGetObjectInputRequest, NONGetObjectInputResponse>;
108pub type RouterHandlerPostObjectResult =
109    RouterHandlerResponse<NONPostObjectInputRequest, NONPostObjectInputResponse>;
110pub type RouterHandlerSelectObjectResult =
111    RouterHandlerResponse<NONSelectObjectInputRequest, NONSelectObjectInputResponse>;
112pub type RouterHandlerDeleteObjectResult =
113    RouterHandlerResponse<NONDeleteObjectInputRequest, NONDeleteObjectInputResponse>;
114
115pub type RouterHandlerPutDataResult =
116    RouterHandlerResponse<NDNPutDataInputRequest, NDNPutDataInputResponse>;
117pub type RouterHandlerGetDataResult =
118    RouterHandlerResponse<NDNGetDataInputRequest, NDNGetDataInputResponse>;
119pub type RouterHandlerDeleteDataResult =
120    RouterHandlerResponse<NDNDeleteDataInputRequest, NDNDeleteDataInputResponse>;
121
122pub type RouterHandlerSignObjectResult =
123    RouterHandlerResponse<CryptoSignObjectInputRequest, CryptoSignObjectInputResponse>;
124pub type RouterHandlerVerifyObjectResult =
125    RouterHandlerResponse<CryptoVerifyObjectInputRequest, CryptoVerifyObjectInputResponse>;
126pub type RouterHandlerEncryptDataResult =
127    RouterHandlerResponse<CryptoEncryptDataInputRequest, CryptoEncryptDataInputResponse>;
128pub type RouterHandlerDecryptDataResult =
129    RouterHandlerResponse<CryptoDecryptDataInputRequest, CryptoDecryptDataInputResponse>;
130
131pub type RouterHandlerAclResult =
132    RouterHandlerResponse<AclHandlerRequest, AclHandlerResponse>;
133
134pub type RouterHandlerInterestResult = 
135    RouterHandlerResponse<InterestHandlerRequest, InterestHandlerResponse>;
136
137pub struct RouterHandlerResponseHelper;
138
139impl RouterHandlerResponseHelper {
140    pub fn encode_with_action(action: RouterHandlerAction) -> String {
141        RouterHandlerResponse::<NONPutObjectInputRequest, NONPutObjectInputResponse> {
142            action,
143            request: None,
144            response: None,
145        }
146        .encode_string()
147    }
148}
149
150impl<REQ, RESP> JsonCodec<RouterHandlerRequest<REQ, RESP>> for RouterHandlerRequest<REQ, RESP>
151where
152    REQ: Send + Sync + 'static + JsonCodec<REQ> + fmt::Display,
153    RESP: Send + Sync + 'static + JsonCodec<RESP> + fmt::Display,
154{
155    fn encode_json(&self) -> Map<String, Value> {
156        let mut obj = Map::new();
157
158        obj.insert("request".to_string(), self.request.encode_value());
159        if let Some(resp) = &self.response {
160            obj.insert("response".to_string(), resp.encode_value());
161        }
162
163        obj
164    }
165
166    fn decode_json(req_obj: &Map<String, Value>) -> BuckyResult<Self> {
167        Ok(Self {
168            request: JsonCodecHelper::decode_field(req_obj, "request")?,
169            response: JsonCodecHelper::decode_option_field(req_obj, "response")?,
170        })
171    }
172}
173
174impl<REQ, RESP> JsonCodec<RouterHandlerResponse<REQ, RESP>> for RouterHandlerResponse<REQ, RESP>
175where
176    REQ: Send + Sync + 'static + JsonCodec<REQ> + fmt::Display,
177    RESP: Send + Sync + 'static + JsonCodec<RESP> + fmt::Display,
178{
179    fn encode_json(&self) -> Map<String, Value> {
180        let mut obj = Map::new();
181
182        obj.insert("action".to_string(), Value::String(self.action.to_string()));
183        if let Some(req) = &self.request {
184            obj.insert("request".to_string(), req.encode_value());
185        }
186        if let Some(resp) = &self.response {
187            obj.insert("response".to_string(), resp.encode_value());
188        }
189
190        obj
191    }
192
193    fn decode_json(req_obj: &Map<String, Value>) -> BuckyResult<Self> {
194        Ok(Self {
195            action: JsonCodecHelper::decode_string_field(req_obj, "action")?,
196            request: JsonCodecHelper::decode_option_field(req_obj, "request")?,
197            response: JsonCodecHelper::decode_option_field(req_obj, "response")?,
198        })
199    }
200}