cyfs_lib/router_handler/ws/
request.rs

1use 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
142// pub type RouterWSHandlerEventResponse = RouterHandlerAnyResponse;
143
144impl 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}