Skip to main content

rmk_config/resolved/
keymap.rs

1use crate::KeyInfo;
2
3/// Resolved keymap for keymap generation: layer count, per-layer actions,
4/// encoder map, plus the matrix-derived per-key info and grid dimensions.
5pub struct Keymap {
6    pub rows: u8,
7    pub cols: u8,
8    pub layers: u8,
9    pub keymap: Vec<Vec<Vec<String>>>,
10    pub encoder_map: Vec<Vec<[String; 2]>>,
11    pub key_info: Vec<Vec<KeyInfo>>,
12    /// Total number of encoders on the board.
13    pub num_encoder: usize,
14}
15
16impl crate::KeyboardTomlConfig {
17    /// Resolve the keymap configuration from TOML config.
18    pub fn keymap(&self) -> Result<Keymap, String> {
19        let (keymap_config, key_info) = self.get_keymap_config()?;
20        // Encoders may be spread across split halves; only the board-wide total is used here.
21        let num_encoder = self.total_encoders();
22
23        // Encoder maps are all-or-none; partial lists would leave encoders dead.
24        for (i, encoders) in keymap_config.encoder_map.iter().enumerate() {
25            if !encoders.is_empty() && encoders.len() != num_encoder {
26                return Err(format!(
27                    "keyboard.toml: [[keymap.layer]] #{i} lists {} encoders but the board has \
28                     {num_encoder} (configure all {num_encoder} or none)",
29                    encoders.len()
30                ));
31            }
32        }
33
34        Ok(Keymap {
35            rows: keymap_config.rows,
36            cols: keymap_config.cols,
37            layers: keymap_config.layers,
38            keymap: keymap_config.keymap,
39            encoder_map: keymap_config.encoder_map,
40            key_info,
41            num_encoder,
42        })
43    }
44}