1pub mod serde_json {
6 use serde::{Deserialize, Serialize};
8 use serde_json::{self, Value};
9
10 #[derive(Debug, Serialize, Deserialize)]
11 pub struct JsonClientMessage<Ops, Id> {
13 pub id: Option<Id>,
16 pub method: Ops,
18 pub params: Value,
20 }
21
22 impl<Ops, Id> JsonClientMessage<Ops, Id> {
23 pub fn new(id: Option<Id>, method: Ops, payload: Value) -> Self {
26 JsonClientMessage {
27 id,
29 method,
30 params: payload,
31 }
32 }
33 }
34
35 #[derive(Debug, Serialize, Deserialize)]
36 pub struct JSONServerMessage<Ops, Id> {
39 #[serde(skip_serializing_if = "Option::is_none")]
42 pub id: Option<Id>,
43 #[serde(skip_serializing_if = "Option::is_none")]
45 pub method: Option<Ops>,
46 #[serde(skip_serializing_if = "Option::is_none")]
48 pub params: Option<Value>,
49 #[serde(skip_serializing_if = "Option::is_none")]
53 pub error: Option<JsonServerError>,
54 }
55
56 impl<Ops, Id> JSONServerMessage<Ops, Id> {
57 pub fn new(
60 id: Option<Id>,
61 method: Option<Ops>,
62 params: Option<Value>,
63 error: Option<JsonServerError>,
65 ) -> Self {
66 JSONServerMessage {
67 method,
69 params,
70 error,
72 id,
73 }
74 }
75 }
76
77 #[derive(Debug, Serialize, Deserialize)]
78 pub struct JsonServerError {
81 code: u64,
82 message: String,
83 data: Option<Value>,
84 }
85
86 impl std::fmt::Display for JsonServerError {
87 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::result::Result<(), std::fmt::Error> {
88 write!(
89 f,
90 "code:{} message:`{}` data:{:?}",
91 self.code, self.message, self.data
92 )
93 }
94 }
95
96 impl From<crate::error::ServerError> for JsonServerError {
97 fn from(err: crate::error::ServerError) -> Self {
98 JsonServerError {
99 code: 0, message: err.to_string(),
101 data: None, }
103 }
104 }
105}
106
107pub mod borsh {
108 use crate::error::Error;
111 use borsh::{BorshDeserialize, BorshSerialize};
112 use workflow_websocket::client::message::Message as WebSocketMessage;
113 pub fn to_ws_msg<Ops, Id>(header: BorshReqHeader<Ops, Id>, payload: &[u8]) -> WebSocketMessage
118 where
119 Id: BorshSerialize + BorshDeserialize,
120 Ops: BorshSerialize + BorshDeserialize,
121 {
122 let header = borsh::to_vec(&header).expect("to_ws_msg header serialize error");
123 let header_len = header.len();
124 let len = payload.len() + header_len;
125 let mut buffer = Vec::with_capacity(len);
126 #[allow(clippy::uninit_vec)]
127 unsafe {
128 buffer.set_len(len);
129 }
130 buffer[0..header_len].copy_from_slice(&header);
131 buffer[header_len..].copy_from_slice(payload);
132 buffer.into()
133 }
134
135 #[derive(Debug, BorshSerialize, BorshDeserialize)]
136 pub struct BorshReqHeader<Ops, Id>
139 where
140 Id: BorshSerialize + BorshDeserialize,
141 Ops: BorshSerialize + BorshDeserialize,
142 {
143 pub id: Option<Id>, pub op: Ops,
147 }
148
149 impl<Ops, Id> BorshReqHeader<Ops, Id>
150 where
151 Id: BorshSerialize + BorshDeserialize,
152 Ops: BorshSerialize + BorshDeserialize,
153 {
154 pub fn new(id: Option<Id>, op: Ops) -> Self {
156 BorshReqHeader { id, op }
157 }
158 }
159
160 #[derive(Debug, BorshSerialize, BorshDeserialize)]
161 pub struct BorshServerMessageHeader<Ops, Id> {
164 pub id: Option<Id>, pub kind: ServerMessageKind,
168 pub op: Option<Ops>,
170 }
171
172 impl<Ops, Id> BorshServerMessageHeader<Ops, Id>
173 {
176 pub fn new(id: Option<Id>, kind: ServerMessageKind, op: Option<Ops>) -> Self {
179 Self { id, kind, op }
180 }
181 }
182
183 #[derive(Debug, Clone, Copy, BorshSerialize, BorshDeserialize)]
184 #[borsh(use_discriminant = true)]
185 pub enum ServerMessageKind {
187 Success = 0,
189 Error = 1,
191 Notification = 0xff,
193 }
194
195 impl From<ServerMessageKind> for u32 {
196 fn from(kind: ServerMessageKind) -> u32 {
197 kind as u32
198 }
199 }
200
201 #[derive(Debug)]
202 pub enum RespError<T>
205 where
206 T: BorshDeserialize,
207 {
208 NoData,
210 Data(T),
212 Rpc(Error),
214 }
215
216 #[derive(Debug)]
217 pub struct BorshClientMessage<'data, Ops, Id>
220 where
221 Id: BorshSerialize + BorshDeserialize + 'data,
222 Ops: BorshSerialize + BorshDeserialize + 'data,
223 {
224 pub header: BorshReqHeader<Ops, Id>,
226 pub payload: &'data [u8],
228 }
229
230 impl<'data, Ops, Id> TryFrom<&'data Vec<u8>> for BorshClientMessage<'data, Ops, Id>
231 where
232 Id: BorshSerialize + BorshDeserialize + 'data,
233 Ops: BorshSerialize + BorshDeserialize + 'data,
234 {
235 type Error = Error;
236
237 fn try_from(src: &'data Vec<u8>) -> Result<Self, Self::Error> {
238 let v: BorshClientMessage<Ops, Id> = src[..].try_into()?;
239 Ok(v)
240 }
241 }
242
243 impl<'data, Ops, Id> TryFrom<&'data [u8]> for BorshClientMessage<'data, Ops, Id>
244 where
245 Id: BorshSerialize + BorshDeserialize + 'data,
246 Ops: BorshSerialize + BorshDeserialize + 'data,
247 {
248 type Error = Error;
249
250 fn try_from(src: &'data [u8]) -> Result<Self, Self::Error> {
251 let mut payload = src;
252 let header = BorshReqHeader::<Ops, Id>::deserialize(&mut payload)?;
253 let message = BorshClientMessage { header, payload };
254 Ok(message)
255 }
256 }
257
258 #[derive(Debug)]
259 pub struct BorshServerMessage<'data, Ops, Id>
262 where
263 Id: BorshSerialize + BorshDeserialize + 'data,
264 Ops: BorshSerialize + BorshDeserialize + 'data,
265 {
266 pub header: BorshServerMessageHeader<Ops, Id>,
268 pub payload: &'data [u8],
270 }
271
272 impl<'data, Ops, Id> BorshServerMessage<'data, Ops, Id>
273 where
274 Id: BorshSerialize + BorshDeserialize + 'data,
275 Ops: BorshSerialize + BorshDeserialize + 'data,
276 {
277 pub fn new(
279 header: BorshServerMessageHeader<Ops, Id>,
280 payload: &'data [u8],
281 ) -> BorshServerMessage<'data, Ops, Id> {
282 BorshServerMessage { header, payload }
283 }
284
285 pub fn try_to_vec(&self) -> Result<Vec<u8>, Error> {
288 let header = borsh::to_vec(&self.header)?;
289 let header_len = header.len();
290
291 let len = header_len + self.payload.len();
292 let mut buffer = Vec::with_capacity(len);
293 #[allow(clippy::uninit_vec)]
294 unsafe {
295 buffer.set_len(len);
296 }
297
298 buffer[0..header_len].copy_from_slice(&header);
299 if !self.payload.is_empty() {
300 buffer[header_len..].copy_from_slice(self.payload);
301 }
302 Ok(buffer)
303 }
304 }
305
306 impl<'data, Ops, Id> TryFrom<&'data [u8]> for BorshServerMessage<'data, Ops, Id>
307 where
308 Id: BorshSerialize + BorshDeserialize + 'data,
309 Ops: BorshSerialize + BorshDeserialize + 'data,
310 {
311 type Error = Error;
312
313 fn try_from(src: &'data [u8]) -> Result<Self, Self::Error> {
314 let mut payload = src;
315 let header = <BorshServerMessageHeader<Ops, Id>>::deserialize(&mut payload)?;
316 let message = BorshServerMessage { header, payload };
317 Ok(message)
318 }
319 }
320}