1use crate::BehaviorConfig;
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.tap_hold = behavior.tap_hold.or(default.tap_hold);
23 behavior.one_shot = behavior.one_shot.or(default.one_shot);
24 behavior.combo = behavior.combo.or(default.combo);
25 if let Some(combo) = &behavior.combo {
26 if combo.combos.len() > self.rmk.combo_max_num {
27 return Err("keyboard.toml: number of combos is greater than combo_max_num configured under [rmk] section".to_string());
28 }
29 for (i, c) in combo.combos.iter().enumerate() {
30 if c.actions.len() > self.rmk.combo_max_length {
31 return Err(format!("keyboard.toml: number of keys in combo #{} is greater than combo_max_length configured under [rmk] section", i));
32 }
33 if let Some(layer) = c.layer {
34 if layer >= layout.layers {
35 return Err(format!(
36 "keyboard.toml: layer in combo #{} is greater than [layout.layers]",
37 i
38 ));
39 }
40 }
41 }
42 }
43 behavior.fork = behavior.fork.or(default.fork);
44 if let Some(fork) = &behavior.fork {
45 if fork.forks.len() > self.rmk.fork_max_num {
46 return Err("keyboard.toml: number of forks is greater than fork_max_num configured under [rmk] section".to_string());
47 }
48 }
49 Ok(behavior)
50 }
51 None => Ok(default),
52 }
53 }
54}