1pub mod msg_test;
7pub mod lib_impl;
8
9pub use lib_impl::berde::*;
10pub use lib_impl::compiler::*;
11pub use bitis_macros::{BiserdiMsg, BiserdiOneOf, BiserdiEnum};
12
13pub fn serialize<T: BiserdiTrait>(data: &T) -> Vec<u8>{
14 let mut ser = Biseri::new();
15
16 data.bit_serialize(&mut ser);
17 let (_bits, _bytes) = ser.finish_add_data().unwrap();
18 ser.get_data().to_owned()
21}
22pub fn deserialize<T: BiserdiTrait>(data: &Vec<u8>) -> Option<(T, u64)> {
23 let mut der = Bides::from_vec(data);
24
25 T::bit_deserialize(1, &mut der)
26}
27
28#[cfg(test)]
29mod msg_deserialization {
30 use rstest::rstest;
31 use super::*;
32
33
34 #[derive(BiserdiMsg, Debug, Clone, PartialEq)]
35 struct MsgLalaBase {
36 a1: VarWithGivenBitSize<u16, 13>,
37 b1: bool,
38 b2: bool,
39 f: f32,
40 }
41
42 #[derive(BiserdiMsg, Debug, Clone, PartialEq)]
43 struct MsgLili {
44 inner_msg: MsgLalaBase,
45 b1: bool,
46 b2: VarWithGivenBitSize<u8, 7>,
47 signed: VarWithGivenBitSize<i8, 4>,
48 }
49
50 #[rstest]
51 fn msg_simple_msg_serde() {
52 let mut ser = Biseri::new();
53
54 let m = MsgLalaBase { a1: 7345.into(), b1: true, b2: false, f: 12345.6789 };
55 println!("m: {:?}", m);
56
57 m.bit_serialize(&mut ser);
58 let (bits, bytes) = ser.finish_add_data().unwrap();
59 println!("bits: {}, bytes: {}", bits, bytes);
60
61 let mut der = Bides::from_biseri(&ser);
63
64 let mm = MsgLalaBase::bit_deserialize(1, &mut der);
65 assert!(mm.is_some());
66 let mm = mm.unwrap();
67 println!("mm: {:?}", mm);
68
69 assert_eq!(m, mm.0);
70 }
71
72 #[rstest]
73 fn msg_with_inner_msg_serde() {
74 let mut ser = Biseri::new();
75
76 let m = MsgLili {
77 inner_msg: MsgLalaBase { a1: 7345.into(), b1: true, b2: false, f: 12345.6789 },
78 b1: true,
79 b2: 11.into(),
80 signed: (-3).into()
81 };
82 println!("m: {:?}", m);
83
84 m.bit_serialize(&mut ser);
85 let (bits, bytes) = ser.finish_add_data().unwrap();
86 println!("bits: {}, bytes: {}", bits, bytes);
87
88 let mut der = Bides::from_biseri(&ser);
90
91 let mm = MsgLili::bit_deserialize(1, &mut der);
92 assert!(mm.is_some());
93 let mm = mm.unwrap();
94 println!("mm: {:?}", mm);
95
96 assert_eq!(m, mm.0);
97 }
98
99 #[derive(BiserdiOneOf, Debug, Clone, PartialEq)]
100 #[biserdi_enum_id_dynbits(4)]
101 enum OOLili {
102 InnerMsg(MsgLalaBase),
103 B1(bool),
104 F2(f32),
105 Signed(VarWithGivenBitSize<i8, 6>),
107 }
108
109 fn oneof_test_serde(m: OOLili) {
110 println!("m: {:?}", m);
111
112 let mut ser = Biseri::new();
113
114 m.bit_serialize(&mut ser);
115 let (bits, bytes) = ser.finish_add_data().unwrap();
116 println!("bits: {}, bytes: {}", bits, bytes);
117
118 let mut der = Bides::from_biseri(&ser);
120
121 let mm = OOLili::bit_deserialize(1, &mut der);
122 assert!(mm.is_some());
123 let mm = mm.unwrap();
124 println!("mm: {:?}", mm);
125
126 assert_eq!(bits, mm.1);
127 assert_eq!(m, mm.0);
128 }
129 #[rstest]
130 fn oneof_msg_serde() {
131 let m = OOLili::InnerMsg(MsgLalaBase { a1: 7345.into(), b1: true, b2: false, f: 12345.6789 });
132 oneof_test_serde(m);
133 }
134 #[rstest]
135 fn oneof_bool_serde() {
136 let m = OOLili::B1(true);
137 oneof_test_serde(m);
138 }
139 #[rstest]
140 fn oneof_f32_serde() {
141 let m = OOLili::F2(98765.54321);
142 oneof_test_serde(m);
143 }
144 #[rstest]
145 fn oneof_var_with_given_bit_size_serde() {
146 let m = OOLili::Signed((-3).into());
147 oneof_test_serde(m);
148 }
149
150 #[derive(BiserdiEnum, Debug, Clone, PartialEq)]
151 #[biserdi_enum_id_dynbits(4)]
152 #[allow(nonstandard_style)]
153 enum EnumLele {
154 One,
155 Two,
156 Three
157 }
158 #[derive(BiserdiMsg, Debug, Clone, PartialEq)]
159 struct MsgLalaEnum {
160 e1: EnumLele,
161 b1: bool,
162 b2: bool,
163 }
164 #[rstest]
165 fn enum_msg_serde() {
166 let mut ser = Biseri::new();
167
168 let msg = MsgLalaEnum{
169 e1: EnumLele::Two,
170 b1: true,
171 b2: false,
172 };
173 msg.bit_serialize(&mut ser);
174 let (bits, bytes) = ser.finish_add_data().unwrap();
175 println!("bits: {}, bytes: {}", bits, bytes);
176
177 let mut der = Bides::from_biseri(&ser);
179
180 let mm = MsgLalaEnum::bit_deserialize(1, &mut der);
181 assert!(mm.is_some());
182 let mm = mm.unwrap();
183 println!("mm: {:?}", mm);
184
185 assert_eq!(bits, mm.1);
186 assert_eq!(msg, mm.0);
187 }
188
189}
190
191#[cfg(test)]
192mod msg_deserialization_ver {
193 use rstest::rstest;
194 use super::*;
195 pub use bitis_macros::{BiserdiMsgVersioned};
196
197 #[derive(BiserdiMsg, Debug, Clone, PartialEq)]
198 struct MsgLalaBase {
199 a1: VarWithGivenBitSize<u16, 13>,
200 b1: bool,
201 b2: bool,
202 f: f32,
203 }
204
205 #[derive(BiserdiMsg, Debug, Clone, PartialEq)]
207 struct MsgLalaV1 {}
208 #[derive(BiserdiMsg, Debug, Clone, PartialEq)]
209 struct MsgLalaExtV1 {
210 v1: MsgLalaV1
211 }
212 #[derive(BiserdiMsgVersioned, Debug, Clone, PartialEq)]
213 struct MsgLalaVersionedV1 {
214 base: MsgLalaBase,
215 ext: MsgLalaExtV1
216 }
217 #[derive(BiserdiMsg, Debug, Clone, PartialEq)]
218 #[allow(nonstandard_style)]
219 struct MsgLala_V2 {
220 e1: VarWithGivenBitSize<i8, 4>,
221 e2: bool,
222 }
223 #[derive(BiserdiMsg, Debug, Clone, PartialEq)]
224 #[allow(nonstandard_style)]
225 struct MsgLala_ExtV2 {
226 v1: MsgLalaV1,
227 v2: MsgLala_V2
228 }
229 #[derive(BiserdiMsgVersioned, Debug, Clone, PartialEq)]
230 struct MsgLalaVersionedV2 {
231 base: MsgLalaBase,
232 ext: MsgLala_ExtV2
233 }
234 #[derive(BiserdiMsg, Debug, Clone, PartialEq)]
235 struct MsgLalaV3 {}
236 #[derive(BiserdiMsg, Debug, Clone, PartialEq)]
237 #[allow(nonstandard_style)]
238 struct MsgLala_ExtV3 {
239 v1: MsgLalaV1,
240 v2: MsgLala_V2,
241 v3: MsgLalaV3
242 }
243 #[derive(BiserdiMsgVersioned, Debug, Clone, PartialEq)]
244 struct MsgLalaVersionedV3 {
245 base: MsgLalaBase,
246 ext: MsgLala_ExtV3
247 }
248 #[derive(BiserdiMsg, Debug, Clone, PartialEq)]
249 struct MsgLalaV4 {
250 ee1: bool,
251 ee2: bool,
252 ee3: VarWithGivenBitSize<i16, 14>,
253 }
254 #[derive(BiserdiMsg, Debug, Clone, PartialEq)]
255 struct MsgLalaExtV4 {
256 v1: MsgLalaV1,
257 v2: MsgLala_V2,
258 v3: MsgLalaV3,
259 v4: MsgLalaV4
260 }
261 #[derive(BiserdiMsgVersioned, Debug, Clone, PartialEq)]
262 struct MsgLalaVersionedV4 {
263 base: MsgLalaBase,
264 ext: MsgLalaExtV4
265 }
266 #[rstest]
267 fn encode_v2_decode_v1() {
269 let mut ser = Biseri::new();
270
271 let m = MsgLalaVersionedV2 {
272 base: MsgLalaBase { a1: 1234.into(), b1: true, b2: false, f: 9876.54321, },
273 ext: MsgLala_ExtV2 { v1: MsgLalaV1 {}, v2: MsgLala_V2 { e1: (-6).into(), e2: true } }
274 };
275 m.bit_serialize(&mut ser);
276 println!("m: {:?}", m);
277
278 let (bits, bytes) = ser.finish_add_data().unwrap();
279 println!("bits: {}, bytes: {}", bits, bytes);
280
281 let mut der = Bides::from_biseri(&ser.clone());
283
284 let mm = MsgLalaVersionedV2::bit_deserialize(1, &mut der);
285 println!("v2 - mm: {:?}", mm);
286 assert!(mm.is_some());
287 let mm = mm.unwrap();
288
289 assert_eq!(bits, mm.1);
290 assert_eq!(m, mm.0);
291
292 let mut der = Bides::from_biseri(&ser);
294
295 let mm = MsgLalaVersionedV1::bit_deserialize(1, &mut der);
296 println!("v1 - mm: {:?}", mm);
297 assert!(mm.is_some());
298 let mm = mm.unwrap();
299
300 assert_eq!(bits, mm.1);
301 assert_eq!(m.base, mm.0.base);
302 }
303 #[rstest]
304 fn encode_v3_decode_v2_and_v1() {
305 let mut ser = Biseri::new();
306
307 let m = MsgLalaVersionedV4 {
308 base: MsgLalaBase { a1: 1234.into(), b1: true, b2: false, f: 9876.54321, },
309 ext: MsgLalaExtV4 {
310 v1: MsgLalaV1 {},
311 v2: MsgLala_V2 { e1: (-6).into(), e2: true },
312 v3: MsgLalaV3 {},
313 v4: MsgLalaV4 { ee1: false, ee2: true, ee3: (-5678).into(), }
314 }
315 };
316
317 m.bit_serialize(&mut ser);
318 println!("m: {:?}", m);
319
320 let (bits, bytes) = ser.finish_add_data().unwrap();
321 println!("bits: {}, bytes: {}", bits, bytes);
322
323 let mut der = Bides::from_biseri(&ser.clone());
325
326 let mm = MsgLalaVersionedV4::bit_deserialize(1, &mut der);
327 println!("v3 - mm: {:?}", mm);
328 assert!(mm.is_some());
329 let mm = mm.unwrap();
330
331 assert_eq!(bits, mm.1);
332 assert_eq!(m, mm.0);
333
334 let mut der = Bides::from_biseri(&ser.clone());
336
337 let mm = MsgLalaVersionedV2::bit_deserialize(1, &mut der);
338 println!("v2 - mm: {:?}", mm);
339 assert!(mm.is_some());
340 let mm = mm.unwrap();
341
342 assert_eq!(bits, mm.1);
343 assert_eq!(m.base, mm.0.base);
344 assert_eq!(m.ext.v2, mm.0.ext.v2);
345
346 let mut der = Bides::from_biseri(&ser);
348
349 let mm = MsgLalaVersionedV1::bit_deserialize(1, &mut der);
350 println!("v1 - mm: {:?}", mm);
351 assert!(mm.is_some());
352 let mm = mm.unwrap();
353
354 assert_eq!(bits, mm.1);
355 assert_eq!(m.base, mm.0.base);
356 }
357
358 #[derive(BiserdiMsgVersioned, Debug, Clone, PartialEq)]
359 enum MsgLalaVersionEnum {
360 V1(MsgLalaVersionedV1),
361 V2(MsgLalaVersionedV2),
362 V3(MsgLalaVersionedV3),
363 V4(MsgLalaVersionedV4),
364 }
365 #[rstest]
366 fn encode_v3_decode_v2_and_v4() {
367 let mut ser = Biseri::new();
368
369 let mv = MsgLalaVersionedV3 {
370 base: MsgLalaBase { a1: 1234.into(), b1: true, b2: false, f: 9876.54321, },
371 ext: MsgLala_ExtV3 {
372 v1: MsgLalaV1 {},
373 v2: MsgLala_V2 { e1: (-6).into(), e2: true },
374 v3: MsgLalaV3 {},
375 }
376 };
377 let m = MsgLalaVersionEnum::V3(mv.clone());
378
379 m.bit_serialize(&mut ser);
380 println!("m: {:?}", m);
381
382 let (bits, bytes) = ser.finish_add_data().unwrap();
383 println!("bits: {}, bytes: {}", bits, bytes);
384
385 let mut der = Bides::from_biseri(&ser.clone());
387
388 let mm = MsgLalaVersionEnum::bit_deserialize(2, &mut der);
389 println!("v2 - mm: {:?}", mm);
390 assert!(mm.is_some());
391 let mm = mm.unwrap();
392
393 let mmm = match mm.0.clone() {
394 MsgLalaVersionEnum::V2(v) => v, _ => { panic!("Wrong enum, expected v2") }
395 };
396
397
398 assert_eq!(bits, mm.1);
399 assert_eq!(mv.base, mmm.base);
400 assert_eq!(mv.ext.v1, mmm.ext.v1);
401 assert_eq!(mv.ext.v2, mmm.ext.v2);
402
403 let mut der = Bides::from_biseri(&ser.clone());
405
406 let mm = MsgLalaVersionEnum::bit_deserialize(3, &mut der);
407 println!("v4 - mm: {:?}", mm);
408 assert!(mm.is_some());
409 let mm = mm.unwrap();
410
411 let mmm = match mm.0.clone() {
412 MsgLalaVersionEnum::V3(v) => v, _ => { panic!("Wrong enum, expected v3") }
413 };
414
415 assert_eq!(bits, mm.1);
416 assert_eq!(mv.base, mmm.base);
417 assert_eq!(mv.ext.v2, mmm.ext.v2);
418 assert_eq!(mv.ext.v3, mmm.ext.v3);
419 }
420}