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}