use bevy::prelude::*;
mod os;
use crate::app::binds;
use crate::app::settings::GameSettings;
pub fn read_keymap(world: &mut World) {
let caps = ask();
if caps.is_empty() {
return;
}
let may_save = world
.get_resource::<State<crate::app::Screen>>()
.is_some_and(|screen| crate::app::language::may_save(screen.get()));
let mut settings = world.resource_mut::<GameSettings>();
let mut keycaps = settings.keycaps.clone();
if keycaps.adopt(&caps) {
settings.keycaps = keycaps;
if may_save {
settings.save();
}
}
}
fn ask() -> Vec<(KeyCode, char)> {
os::query()
.into_iter()
.filter_map(|(name, cap)| {
let key = binds::key_from_name(name).or_else(|| binds::global_key_from_name(name))?;
Some((key, cap))
})
.collect()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn every_key_the_platform_names_is_one_the_game_knows() {
let named = os::query();
for (name, _) in &named {
assert!(
binds::key_from_name(name).is_some() || binds::global_key_from_name(name).is_some(),
"{name} is not a key this game can name"
);
}
assert_eq!(
ask().len(),
named.len(),
"an answer was dropped in translation"
);
}
#[test]
fn the_answer_is_one_the_caps_table_would_take() {
for (key, cap) in ask() {
assert!(cap.is_ascii_graphic(), "{key:?} said {cap:?}");
}
}
}