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