1use serde::{de::DeserializeOwned, Serialize};
2
3use crate::types::BinaryData;
4
5pub trait Payload: Sized {
7 fn name() -> &'static str;
8 fn parse(data: BinaryData) -> Result<Self, ()>;
9 fn to_val(self) -> BinaryData;
10}
11
12impl Payload for bool {
13 fn name() -> &'static str {
14 "boolean"
15 }
16
17 fn parse(data: BinaryData) -> Result<Self, ()> {
18 match data {
19 BinaryData::Boolean(val) => Ok(val),
20 _ => Err(()),
21 }
22 }
23
24 fn to_val(self) -> BinaryData {
25 BinaryData::Boolean(self)
26 }
27}
28
29impl Payload for f64 {
30 fn name() -> &'static str {
31 "double"
32 }
33
34 fn parse(data: BinaryData) -> Result<Self, ()> {
35 match data {
36 BinaryData::Double(val) => Ok(val),
37 _ => Err(()),
38 }
39 }
40
41 fn to_val(self) -> BinaryData {
42 BinaryData::Double(self)
43 }
44}
45
46impl Payload for f32 {
47 fn name() -> &'static str {
48 "float"
49 }
50
51 fn parse(data: BinaryData) -> Result<Self, ()> {
52 match data {
53 BinaryData::Float(val) => Ok(val),
54 _ => Err(()),
55 }
56 }
57
58 fn to_val(self) -> BinaryData {
59 BinaryData::Float(self)
60 }
61}
62
63macro_rules! payload_num {
64 ($value:ident) => {
65 impl Payload for $value {
66 fn name() -> &'static str {
67 "int"
68 }
69
70 fn parse(data: BinaryData) -> Result<Self, ()> {
71 match data {
72 BinaryData::Int(val) => Ok(val as $value),
73 _ => Err(()),
74 }
75 }
76
77 fn to_val(self) -> BinaryData {
78 BinaryData::Int(self as i64)
79 }
80 }
81 };
82}
83
84payload_num!(i128);
85payload_num!(i64);
86payload_num!(i32);
87payload_num!(i16);
88payload_num!(i8);
89payload_num!(u128);
90payload_num!(u64);
91payload_num!(u32);
92payload_num!(u16);
93payload_num!(u8);
94
95impl Payload for String {
96 fn name() -> &'static str {
97 "string"
98 }
99
100 fn parse(data: BinaryData) -> Result<Self, ()> {
101 match data {
102 BinaryData::Str(val) => Ok(val),
103 _ => Err(()),
104 }
105 }
106
107 fn to_val(self) -> BinaryData {
108 BinaryData::Str(self)
109 }
110}
111
112pub struct Json<D: DeserializeOwned + Serialize>(D);
113
114impl<D: DeserializeOwned + Serialize> Payload for Json<D> {
115 fn name() -> &'static str {
116 "string"
117 }
118
119 fn parse(data: BinaryData) -> Result<Self, ()> {
120 match data {
121 BinaryData::Str(val) => Ok(Json(serde_json::from_str(&val).map_err(|_| ())?)),
122 _ => Err(()),
123 }
124 }
125
126 fn to_val(self) -> BinaryData {
127 BinaryData::Str(serde_json::to_string(&self.0).unwrap())
128 }
129}
130
131impl Payload for Vec<u8> {
132 fn name() -> &'static str {
133 "raw"
134 }
135
136 fn parse(data: BinaryData) -> Result<Self, ()> {
137 match data {
138 BinaryData::Bin(val) => Ok(val),
139 _ => Err(()),
140 }
141 }
142
143 fn to_val(self) -> BinaryData {
144 BinaryData::Bin(self)
145 }
146}
147
148pub struct MsgPack(Vec<u8>);
149
150impl Payload for MsgPack {
151 fn name() -> &'static str {
152 "msgpack"
153 }
154
155 fn parse(data: BinaryData) -> Result<Self, ()> {
156 match data {
157 BinaryData::Bin(val) => Ok(MsgPack(val)),
158 _ => Err(()),
159 }
160 }
161
162 fn to_val(self) -> BinaryData {
163 BinaryData::Bin(self.0)
164 }
165}
166
167pub struct Rpc(Vec<u8>);
168
169impl Payload for Rpc {
170 fn name() -> &'static str {
171 "rpc"
172 }
173
174 fn parse(data: BinaryData) -> Result<Self, ()> {
175 match data {
176 BinaryData::Bin(val) => Ok(Rpc(val)),
177 _ => Err(()),
178 }
179 }
180
181 fn to_val(self) -> BinaryData {
182 BinaryData::Bin(self.0)
183 }
184}
185
186pub struct ProtoBuf(Vec<u8>);
187
188impl Payload for ProtoBuf {
189 fn name() -> &'static str {
190 "protobuf"
191 }
192
193 fn parse(data: BinaryData) -> Result<Self, ()> {
194 match data {
195 BinaryData::Bin(val) => Ok(ProtoBuf(val)),
196 _ => Err(()),
197 }
198 }
199
200 fn to_val(self) -> BinaryData {
201 BinaryData::Bin(self.0)
202 }
203}
204
205impl Payload for Vec<bool> {
206 fn name() -> &'static str {
207 "boolean[]"
208 }
209
210 fn parse(data: BinaryData) -> Result<Self, ()> {
211 match data {
212 BinaryData::BoolArray(val) => Ok(val),
213 _ => Err(()),
214 }
215 }
216
217 fn to_val(self) -> BinaryData {
218 BinaryData::BoolArray(self)
219 }
220}
221
222impl Payload for Vec<f64> {
223 fn name() -> &'static str {
224 "double[]"
225 }
226
227 fn parse(data: BinaryData) -> Result<Self, ()> {
228 match data {
229 BinaryData::DoubleArray(val) => Ok(val),
230 _ => Err(()),
231 }
232 }
233
234 fn to_val(self) -> BinaryData {
235 BinaryData::DoubleArray(self)
236 }
237}
238
239impl Payload for Vec<f32> {
240 fn name() -> &'static str {
241 "float[]"
242 }
243
244 fn parse(data: BinaryData) -> Result<Self, ()> {
245 match data {
246 BinaryData::FloatArray(val) => Ok(val),
247 _ => Err(()),
248 }
249 }
250
251 fn to_val(self) -> BinaryData {
252 BinaryData::FloatArray(self)
253 }
254}
255
256impl Payload for Vec<i64> {
257 fn name() -> &'static str {
258 "int[]"
259 }
260
261 fn parse(data: BinaryData) -> Result<Self, ()> {
262 match data {
263 BinaryData::IntArray(val) => Ok(val),
264 _ => Err(()),
265 }
266 }
267
268 fn to_val(self) -> BinaryData {
269 BinaryData::IntArray(self)
270 }
271}
272
273impl Payload for Vec<String> {
274 fn name() -> &'static str {
275 "string[]"
276 }
277
278 fn parse(data: BinaryData) -> Result<Self, ()> {
279 match data {
280 BinaryData::StringArray(val) => Ok(val),
281 _ => Err(()),
282 }
283 }
284
285 fn to_val(self) -> BinaryData {
286 BinaryData::StringArray(self)
287 }
288}