nt_rs/
payload.rs

1use serde::{de::DeserializeOwned, Serialize};
2
3use crate::types::BinaryData;
4
5/// Any type that can be sent directly over network tables
6pub 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}