use std::{fs::File, io::Read, path::PathBuf}; use anyhow::Result; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone)] pub struct KeySymbols { pub enter: String, pub left: String, pub right: String, pub up: String, pub down: String, pub backspace: String, pub home: String, pub end: String, pub page_up: String, pub page_down: String, pub tab: String, pub back_tab: String, pub delete: String, pub insert: String, pub esc: String, pub control: String, pub shift: String, pub alt: String, } #[rustfmt::skip] impl Default for KeySymbols { fn default() -> Self { Self { enter: "\u{23ce}".into(), //⏎ left: "\u{2190}".into(), //← right: "\u{2192}".into(), //→ up: "\u{2191}".into(), //↑ down: "\u{2193}".into(), //↓ backspace: "\u{232b}".into(), //⌫ home: "\u{2912}".into(), //⤒ end: "\u{2913}".into(), //⤓ page_up: "\u{21de}".into(), //⇞ page_down: "\u{21df}".into(), //⇟ tab: "\u{21e5}".into(), //⇥ back_tab: "\u{21e4}".into(), //⇤ delete: "\u{2326}".into(), //⌦ insert: "\u{2380}".into(), //⎀ esc: "\u{238b}".into(), //⎋ control: "^".into(), shift: "\u{21e7}".into(), //⇧ alt: "\u{2325}".into(), //⌥ } } } impl KeySymbols { pub fn init(file: PathBuf) -> Self { if file.exists() { let file = KeySymbolsFile::read_file(file).unwrap_or_default(); file.get_symbols() } else { Self::default() } } } //TODO: this could auto generated in a proc macro #[derive(Serialize, Deserialize, Default)] pub struct KeySymbolsFile { pub enter: Option, pub left: Option, pub right: Option, pub up: Option, pub down: Option, pub backspace: Option, pub home: Option, pub end: Option, pub page_up: Option, pub page_down: Option, pub tab: Option, pub back_tab: Option, pub delete: Option, pub insert: Option, pub esc: Option, pub control: Option, pub shift: Option, pub alt: Option, } impl KeySymbolsFile { fn read_file(config_file: PathBuf) -> Result { let mut f = File::open(config_file)?; let mut buffer = Vec::new(); f.read_to_end(&mut buffer)?; Ok(ron::de::from_bytes(&buffer)?) } pub fn get_symbols(self) -> KeySymbols { let default = KeySymbols::default(); KeySymbols { enter: self.enter.unwrap_or(default.enter), left: self.left.unwrap_or(default.left), right: self.right.unwrap_or(default.right), up: self.up.unwrap_or(default.up), down: self.down.unwrap_or(default.down), backspace: self.backspace.unwrap_or(default.backspace), home: self.home.unwrap_or(default.home), end: self.end.unwrap_or(default.end), page_up: self.page_up.unwrap_or(default.page_up), page_down: self.page_down.unwrap_or(default.page_down), tab: self.tab.unwrap_or(default.tab), back_tab: self.back_tab.unwrap_or(default.back_tab), delete: self.delete.unwrap_or(default.delete), insert: self.insert.unwrap_or(default.insert), esc: self.esc.unwrap_or(default.esc), control: self.control.unwrap_or(default.control), shift: self.shift.unwrap_or(default.shift), alt: self.alt.unwrap_or(default.alt), } } }