binary_codec/
config.rs

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