use keymap_config::Warning;
#[derive(Clone, Debug, PartialEq)]
enum Action {
Quit,
Save,
SplitPane,
}
fn main() {
let toml = r#"
[keys]
"ctrl+q" = "quit"
"ctrl+s" = "save"
"control+s" = "split_pane" # same chord as ctrl+s -> conflict (within global)
"ctrl+z" = "undo" # no such action -> unknown
[layers.panel]
"ctrl+s" = "split_pane" # overrides global's ctrl+s when panel is active
"#;
let out = keymap_config::from_str(toml, |name| match name {
"quit" => Some(Action::Quit),
"save" => Some(Action::Save),
"split_pane" => Some(Action::SplitPane),
_ => None,
})
.expect("valid TOML and key strings");
for (name, keymap) in &out.layers {
println!("layer {name:?} ({} binding(s)):", keymap.len());
let mut listing: Vec<(String, &Action)> = keymap
.iter()
.map(|(input, action)| (input.to_string(), action))
.collect();
listing.sort_by(|a, b| a.0.cmp(&b.0));
for (key, action) in &listing {
println!(" {key:>8} -> {action:?}");
}
}
if !out.warnings.is_empty() {
println!("\nwarnings:");
for warning in &out.warnings {
match warning {
Warning::Conflict {
chord,
contenders,
winner,
} => {
println!(" conflict on {chord}: {contenders:?} — kept {winner:?}");
}
Warning::UnknownAction { key, action } => {
println!(" {key}: unknown action {action:?}");
}
_ => println!(" (other warning)"),
}
}
}
}