1use std::{collections::HashMap};
2
3#[derive(Clone, Debug)]
4pub struct SerializerConfig<T = ()> where T: Clone {
5 toggle_keys: HashMap<String, bool>,
6 length_keys: HashMap<String, usize>,
7 variant_keys: HashMap<String, u8>,
8 pub bits: u8,
9 pub pos: usize,
10 pub discriminator: Option<u8>,
11 pub data: Option<T>
12}
13
14impl Default for SerializerConfig {
15 fn default() -> Self {
16 Self::new(None::<()>)
17 }
18}
19
20impl<T : Clone> SerializerConfig<T> {
21 pub fn new(data: Option<T>) -> Self {
22 Self {
23 toggle_keys: HashMap::new(),
24 length_keys: HashMap::new(),
25 variant_keys: HashMap::new(),
26 bits: 0,
27 pos: 0,
28 discriminator: None,
29 data
30 }
31 }
32
33 pub fn next_reset_bits_pos(&self) -> usize {
34 if self.bits == 0 {
35 self.pos
36 } else {
37 self.pos + 1
38 }
39 }
40
41 pub fn reset_bits(&mut self, is_read: bool) {
42 if self.bits != 0 && is_read {
43 self.pos += 1;
44 }
45 self.bits = 0;
46 }
47
48 pub fn set_toggle(&mut self, key: &str, value: bool) {
49 println!("Setting toggle key {} to {}", key, value);
50 self.toggle_keys.insert(key.to_string(), value);
51 }
52
53 pub fn set_length(&mut self, key: &str, value: usize) {
54 self.length_keys.insert(key.to_string(), value);
55 }
56
57 pub fn set_variant(&mut self, key: &str, value: u8) {
58 self.variant_keys.insert(key.to_string(), value);
59 }
60
61 pub fn get_toggle(&self, key: &str) -> Option<bool> {
62 if key.starts_with('!') {
63 let key = &key[1..];
64 return self.toggle_keys.get(key).map(|v| !*v);
65 }
66
67 self.toggle_keys.get(key).copied()
68 }
69
70 pub fn get_length(&self, key: &str) -> Option<usize> {
71 self.length_keys.get(key).copied()
72 }
73
74 pub fn get_variant(&self, key: &str) -> Option<u8> {
75 self.variant_keys.get(key).copied()
76 }
77
78 pub fn reset(&mut self) {
79 self.bits = 0;
80 self.pos = 0;
81 self.discriminator = None;
82 }
83}