#![deny(missing_docs)]
#![warn(clippy::all)]
pub mod error;
pub mod mapping;
pub mod parser;
pub mod types;
pub mod utils;
pub use error::KeyParseError;
pub use mapping::custom::{CustomKey, CustomKeyMap};
pub use types::{Key, KeyCodeMapper, Modifier, Platform};
pub use mapping::standard::{parse_key_ignore_case, parse_modifier_ignore_case};
pub use parser::{
parse_input, parse_modifier_with_aliases, parse_shortcut_flexible, parse_shortcut_sequence,
parse_shortcut_with_aliases, Shortcut,
};
use std::str::FromStr;
impl FromStr for Key {
type Err = KeyParseError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
mapping::standard::parse_key_from_str(s)
}
}
impl FromStr for Modifier {
type Err = KeyParseError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
mapping::standard::parse_modifier_from_str(s)
}
}
pub fn current_platform() -> Platform {
#[cfg(target_os = "windows")]
return Platform::Windows;
#[cfg(target_os = "linux")]
return Platform::Linux;
#[cfg(target_os = "macos")]
return Platform::MacOS;
#[cfg(not(any(target_os = "windows", target_os = "linux", target_os = "macos")))]
panic!("Unsupported platform");
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_key_from_str() {
assert_eq!("Escape".parse::<Key>().unwrap(), Key::Escape);
assert_eq!("A".parse::<Key>().unwrap(), Key::A);
assert!("UnknownKey".parse::<Key>().is_err());
}
#[test]
fn test_modifier_from_str() {
assert_eq!("Shift".parse::<Modifier>().unwrap(), Modifier::Shift);
assert_eq!("Control".parse::<Modifier>().unwrap(), Modifier::Control);
assert!("UnknownModifier".parse::<Modifier>().is_err());
}
#[test]
fn test_current_platform() {
let platform = current_platform();
assert!(matches!(
platform,
Platform::Windows | Platform::Linux | Platform::MacOS
));
}
#[test]
fn test_parse_modifier_with_aliases() {
assert_eq!(
parse_modifier_with_aliases("ctrl").unwrap(),
Modifier::Control
);
assert_eq!(parse_modifier_with_aliases("Cmd").unwrap(), Modifier::Meta);
assert_eq!(parse_modifier_with_aliases("win").unwrap(), Modifier::Meta);
assert_eq!(
parse_modifier_with_aliases("lctrl").unwrap(),
Modifier::LeftControl
);
}
#[test]
fn test_parse_shortcut_with_aliases() {
let shortcut = parse_shortcut_with_aliases("ctrl+shift+a").unwrap();
assert_eq!(shortcut.modifiers, vec![Modifier::Control, Modifier::Shift]);
assert_eq!(shortcut.key, Key::A);
let shortcut = parse_shortcut_with_aliases("cmd+q").unwrap();
assert_eq!(shortcut.modifiers, vec![Modifier::Meta]);
assert_eq!(shortcut.key, Key::Q);
}
#[test]
fn test_parse_input() {
let shortcut = parse_input("a").unwrap();
assert!(shortcut.is_simple());
assert_eq!(shortcut.key, Key::A);
let shortcut = parse_input("ctrl+a").unwrap();
assert_eq!(shortcut.modifiers, vec![Modifier::Control]);
assert_eq!(shortcut.key, Key::A);
}
}