binary_codec/
config.rs

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}