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
69pub 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
103pub 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}