cyfs_lib/router_handler/ws/
request.rs1use super::super::http::*;
2use crate::router_handler::*;
3use cyfs_base::*;
4
5use serde_json::{Map, Value};
6
7
8#[derive(Debug)]
9pub struct RouterWSAddHandlerParam {
10 pub chain: RouterHandlerChain,
11 pub category: RouterHandlerCategory,
12 pub id: String,
13 pub dec_id: Option<ObjectId>,
14
15 pub param: RouterAddHandlerParam,
16}
17
18pub struct RouterWSRemoveHandlerParam {
19 pub chain: RouterHandlerChain,
20 pub category: RouterHandlerCategory,
21
22 pub id: String,
23 pub dec_id: Option<ObjectId>,
24}
25
26impl JsonCodec<RouterWSAddHandlerParam> for RouterWSAddHandlerParam {
27 fn encode_json(&self) -> Map<String, Value> {
28 let mut obj = Map::new();
29
30 JsonCodecHelper::encode_string_field(&mut obj, "chain", &self.chain);
31 JsonCodecHelper::encode_string_field(&mut obj, "category", &self.category);
32 JsonCodecHelper::encode_string_field(&mut obj, "id", &self.id);
33 JsonCodecHelper::encode_option_string_field(&mut obj, "dec_id", self.dec_id.as_ref());
34 JsonCodecHelper::encode_field(&mut obj, "param", &self.param);
35
36 obj
37 }
38
39 fn decode_json(req_obj: &Map<String, Value>) -> BuckyResult<Self> {
40 Ok(Self {
41 chain: JsonCodecHelper::decode_string_field(req_obj, "chain")?,
42 category: JsonCodecHelper::decode_string_field(req_obj, "category")?,
43 id: JsonCodecHelper::decode_string_field(req_obj, "id")?,
44 dec_id: JsonCodecHelper::decode_option_string_field(req_obj, "dec_id")?,
45 param: JsonCodecHelper::decode_field(req_obj, "param")?,
46 })
47 }
48}
49
50impl JsonCodec<RouterWSRemoveHandlerParam> for RouterWSRemoveHandlerParam {
51 fn encode_json(&self) -> Map<String, Value> {
52 let mut obj = Map::new();
53
54 JsonCodecHelper::encode_string_field(&mut obj, "chain", &self.chain);
55 JsonCodecHelper::encode_string_field(&mut obj, "category", &self.category);
56 JsonCodecHelper::encode_option_string_field(&mut obj, "dec_id", self.dec_id.as_ref());
57 JsonCodecHelper::encode_string_field(&mut obj, "id", &self.id);
58
59 obj
60 }
61
62 fn decode_json(req_obj: &Map<String, Value>) -> BuckyResult<Self> {
63 Ok(Self {
64 chain: JsonCodecHelper::decode_string_field(req_obj, "chain")?,
65 category: JsonCodecHelper::decode_string_field(req_obj, "category")?,
66 id: JsonCodecHelper::decode_string_field(req_obj, "id")?,
67 dec_id: JsonCodecHelper::decode_option_string_field(req_obj, "dec_id")?,
68 })
69 }
70}
71
72#[derive(Debug)]
73pub struct RouterWSHandlerResponse {
74 pub err: u32,
75 pub msg: Option<String>,
76}
77
78impl JsonCodec<Self> for RouterWSHandlerResponse {
79 fn encode_json(&self) -> Map<String, Value> {
80 let mut obj = Map::new();
81
82 obj.insert("err".to_owned(), Value::String(self.err.to_string()));
83 if self.msg.is_some() {
84 obj.insert(
85 "msg".to_owned(),
86 Value::String(self.msg.as_ref().unwrap().clone()),
87 );
88 }
89
90 obj
91 }
92
93 fn decode_json(obj: &Map<String, Value>) -> BuckyResult<Self> {
94 let mut err: Option<u32> = None;
95 let mut msg: Option<String> = None;
96
97 for (k, v) in obj {
98 match k.as_str() {
99 "err" => {
100 let v = v.as_str().unwrap_or("").parse::<u32>().map_err(|e| {
101 error!("parse err field error: {} {:?}", e, obj);
102
103 BuckyError::from(BuckyErrorCode::InvalidFormat)
104 })?;
105
106 err = Some(v);
107 }
108
109 "msg" => {
110 let v = v.as_str().unwrap_or("");
111 msg = Some(v.to_owned());
112 }
113
114 u @ _ => {
115 error!("unknown handler register response field: {}", u);
116 }
117 }
118 }
119
120 if err.is_none() {
121 error!("err field missing! {:?}", obj);
122 return Err(BuckyError::from(BuckyErrorCode::InvalidFormat));
123 }
124
125 Ok(Self {
126 err: err.unwrap(),
127 msg,
128 })
129 }
130}
131
132
133pub struct RouterWSHandlerEventParam {
134 pub chain: RouterHandlerChain,
135 pub category: RouterHandlerCategory,
136
137 pub id: String,
138
139 pub param: String,
140}
141
142impl RouterWSHandlerEventParam {
145 pub fn encode_json_impl<P>(
146 chain: &RouterHandlerChain,
147 category: &RouterHandlerCategory,
148 id: &str,
149 param: &P,
150 ) -> Map<String, Value>
151 where
152 P: JsonCodec<P>,
153 {
154 let mut obj = Map::new();
155
156 JsonCodecHelper::encode_string_field(&mut obj, "chain", &chain);
157 JsonCodecHelper::encode_string_field(&mut obj, "category", &category);
158 JsonCodecHelper::encode_string_field(&mut obj, "id", &id);
159 obj.insert("param".to_string(), Value::String(param.encode_string()));
160
161 obj
162 }
163}
164
165impl JsonCodec<RouterWSHandlerEventParam> for RouterWSHandlerEventParam {
166 fn encode_json(&self) -> Map<String, Value> {
167 let mut obj = Map::new();
168
169 JsonCodecHelper::encode_string_field(&mut obj, "chain", &self.chain);
170 JsonCodecHelper::encode_string_field(&mut obj, "category", &self.category);
171 JsonCodecHelper::encode_string_field(&mut obj, "id", &self.id);
172 JsonCodecHelper::encode_string_field(&mut obj, "param", &self.param);
173
174 obj
175 }
176
177 fn decode_json(req_obj: &Map<String, Value>) -> BuckyResult<Self> {
178 Ok(Self {
179 chain: JsonCodecHelper::decode_string_field(req_obj, "chain")?,
180 category: JsonCodecHelper::decode_string_field(req_obj, "category")?,
181 id: JsonCodecHelper::decode_string_field(req_obj, "id")?,
182 param: JsonCodecHelper::decode_string_field(req_obj, "param")?,
183 })
184 }
185}