rmk_config/
behavior.rs

1use crate::{BehaviorConfig, MacroOperation};
2
3impl crate::KeyboardTomlConfig {
4    pub fn get_behavior_config(&self) -> Result<BehaviorConfig, String> {
5        let default = self.behavior.clone().unwrap_or_default();
6        let (layout, _) = self.get_layout_config().unwrap();
7        match self.behavior.clone() {
8            Some(mut behavior) => {
9                behavior.tri_layer = match behavior.tri_layer {
10                    Some(tri_layer) => {
11                        if tri_layer.upper >= layout.layers {
12                            return Err("keyboard.toml: Tri layer upper is larger than [layout.layers]".to_string());
13                        } else if tri_layer.lower >= layout.layers {
14                            return Err("keyboard.toml: Tri layer lower is larger than [layout.layers]".to_string());
15                        } else if tri_layer.adjust >= layout.layers {
16                            return Err("keyboard.toml: Tri layer adjust is larger than [layout.layers]".to_string());
17                        }
18                        Some(tri_layer)
19                    }
20                    None => default.tri_layer,
21                };
22                behavior.one_shot = behavior.one_shot.or(default.one_shot);
23                behavior.combo = behavior.combo.or(default.combo);
24                if let Some(combo) = &behavior.combo {
25                    if combo.combos.len() > self.rmk.combo_max_num {
26                        return Err("keyboard.toml: number of combos is greater than combo_max_num configured under [rmk] section".to_string());
27                    }
28                    for (i, c) in combo.combos.iter().enumerate() {
29                        if c.actions.len() > self.rmk.combo_max_length {
30                            return Err(format!(
31                                "keyboard.toml: number of keys in combo #{} is greater than combo_max_length configured under [rmk] section",
32                                i
33                            ));
34                        }
35                        if let Some(layer) = c.layer
36                            && layer >= layout.layers
37                        {
38                            return Err(format!(
39                                "keyboard.toml: layer in combo #{} is greater than [layout.layers]",
40                                i
41                            ));
42                        }
43                    }
44                }
45                behavior.macros = behavior.macros.or(default.macros);
46                if let Some(macros) = &behavior.macros {
47                    let macros_size = macros
48                        .macros
49                        .iter()
50                        .map(|m| {
51                            m.operations
52                                .iter()
53                                .map(|op| match op {
54                                    MacroOperation::Tap { .. }
55                                    | MacroOperation::Down { .. }
56                                    | MacroOperation::Up { .. } => 3,
57                                    MacroOperation::Delay { .. } => 4,
58                                    MacroOperation::Text { text } => text.len(),
59                                })
60                                .sum::<usize>()
61                        })
62                        .sum::<usize>();
63
64                    if macros_size > self.rmk.macro_space_size {
65                        return Err(format!(
66                            "keyboard.toml: total size of macros ({}) is greater than macro_space_size configured under [rmk] section",
67                            macros_size
68                        ));
69                    }
70                }
71                behavior.fork = behavior.fork.or(default.fork);
72                if let Some(fork) = &behavior.fork
73                    && fork.forks.len() > self.rmk.fork_max_num
74                {
75                    return Err(
76                        "keyboard.toml: number of forks is greater than fork_max_num configured under [rmk] section"
77                            .to_string(),
78                    );
79                }
80                behavior.morse = behavior.morse.or(default.morse);
81                if let Some(morse) = &behavior.morse
82                    && let Some(morses) = &morse.morses
83                    && morses.len() > self.rmk.morse_max_num
84                {
85                    return Err(
86                        "keyboard.toml: number of morses is greater than morse_max_num configured under [rmk] section"
87                            .to_string(),
88                    );
89                }
90                Ok(behavior)
91            }
92            None => Ok(default),
93        }
94    }
95}