mod combiner;
mod format;
mod key_event;
mod parse;
mod key_combination;
pub use {
combiner::*,
crossterm,
format::*,
key_event::*,
parse::*,
key_combination::*,
strict::OneToThree,
};
use {
crossterm::event::{KeyCode, KeyModifiers},
once_cell::sync::Lazy,
};
pub static STANDARD_FORMAT: Lazy<KeyCombinationFormat> = Lazy::new(KeyCombinationFormat::default);
#[macro_export]
macro_rules! key {
($($tt:tt)*) => {
$crate::__private::key!(($crate) $($tt)*)
};
}
#[doc(hidden)]
pub mod __private {
pub use crokey_proc_macros::key;
pub use crossterm;
pub use strict::OneToThree;
use crossterm::event::KeyModifiers;
pub const MODS: KeyModifiers = KeyModifiers::NONE;
pub const MODS_CTRL: KeyModifiers = KeyModifiers::CONTROL;
pub const MODS_ALT: KeyModifiers = KeyModifiers::ALT;
pub const MODS_SHIFT: KeyModifiers = KeyModifiers::SHIFT;
pub const MODS_CTRL_ALT: KeyModifiers = KeyModifiers::CONTROL.union(KeyModifiers::ALT);
pub const MODS_ALT_SHIFT: KeyModifiers = KeyModifiers::ALT.union(KeyModifiers::SHIFT);
pub const MODS_CTRL_SHIFT: KeyModifiers = KeyModifiers::CONTROL.union(KeyModifiers::SHIFT);
pub const MODS_CTRL_ALT_SHIFT: KeyModifiers = KeyModifiers::CONTROL
.union(KeyModifiers::ALT)
.union(KeyModifiers::SHIFT);
}
#[cfg(test)]
mod tests {
use {
crate::{key, KeyCombination, OneToThree},
crossterm::event::{KeyCode, KeyModifiers},
};
const _: () = {
key!(x);
key!(ctrl - '{');
key!(alt - '{');
key!(shift - '{');
key!(ctrl - alt - f10);
key!(alt - shift - f10);
key!(ctrl - shift - f10);
key!(ctrl - alt - shift - enter);
};
fn no_mod(code: KeyCode) -> KeyCombination {
code.into()
}
#[test]
fn key() {
assert_eq!(key!(backspace), no_mod(KeyCode::Backspace));
assert_eq!(key!(bAcKsPaCe), no_mod(KeyCode::Backspace));
assert_eq!(key!(0), no_mod(KeyCode::Char('0')));
assert_eq!(key!(9), no_mod(KeyCode::Char('9')));
assert_eq!(key!('x'), no_mod(KeyCode::Char('x')));
assert_eq!(key!('X'), no_mod(KeyCode::Char('x')));
assert_eq!(key!(']'), no_mod(KeyCode::Char(']')));
assert_eq!(key!('à¶ž'), no_mod(KeyCode::Char('à¶ž')));
assert_eq!(key!(f), no_mod(KeyCode::Char('f')));
assert_eq!(key!(F), no_mod(KeyCode::Char('f')));
assert_eq!(key!(à¶ž), no_mod(KeyCode::Char('à¶ž')));
assert_eq!(key!(f10), no_mod(KeyCode::F(10)));
assert_eq!(key!(F10), no_mod(KeyCode::F(10)));
assert_eq!(
key!(ctrl - c),
KeyCombination::new(KeyCode::Char('c'), KeyModifiers::CONTROL)
);
assert_eq!(
key!(alt - shift - c),
KeyCombination::new(KeyCode::Char('C'), KeyModifiers::ALT | KeyModifiers::SHIFT)
);
assert_eq!(key!(shift - alt - '2'), key!(ALT - SHIFT - 2));
assert_eq!(key!(space), key!(' '));
assert_eq!(key!(hyphen), key!('-'));
assert_eq!(key!(minus), key!('-'));
assert_eq!(
key!(ctrl-alt-a-b),
KeyCombination::new(
OneToThree::Two(KeyCode::Char('a'), KeyCode::Char('b')),
KeyModifiers::CONTROL | KeyModifiers::ALT,
)
);
assert_eq!(
key!(alt-f4-a-b),
KeyCombination::new(
OneToThree::Three(KeyCode::F(4), KeyCode::Char('a'), KeyCode::Char('b')),
KeyModifiers::ALT,
)
);
assert_eq!( key!(alt-a-b-f4),
KeyCombination::new(
OneToThree::Three(KeyCode::F(4), KeyCode::Char('a'), KeyCode::Char('b')),
KeyModifiers::ALT,
)
);
assert_eq!(
key!(z-e),
KeyCombination::new(
OneToThree::Two(KeyCode::Char('e'), KeyCode::Char('z')),
KeyModifiers::NONE,
)
);
}
#[test]
fn format() {
let format = crate::KeyCombinationFormat::default();
assert_eq!(format.to_string(key!(insert)), "Insert");
assert_eq!(format.to_string(key!(space)), "Space");
assert_eq!(format.to_string(key!(alt-Space)), "Alt-Space");
assert_eq!(format.to_string(key!(shift-' ')), "Shift-Space");
assert_eq!(format.to_string(key!(alt-hyphen)), "Alt-Hyphen");
}
#[test]
fn key_pattern() {
assert!(matches!(key!(ctrl-alt-shift-c), key!(ctrl-alt-shift-c)));
assert!(!matches!(key!(ctrl-c), key!(ctrl-alt-shift-c)));
assert!(matches!(key!(ctrl-alt-b), key!(ctrl-alt-b)));
assert!(matches!(key!(ctrl-b), key!(ctrl-b)));
assert!(matches!(key!(alt-b), key!(alt-b)));
assert!(!matches!(key!(ctrl-b), key!(alt-b)));
assert!(!matches!(key!(alt-b), key!(ctrl-b)));
assert!(!matches!(key!(alt-b), key!(ctrl-alt-b)));
assert!(!matches!(key!(ctrl-b), key!(ctrl-alt-b)));
assert!(!matches!(key!(ctrl-alt-b), key!(alt-b)));
assert!(!matches!(key!(ctrl-alt-b), key!(ctrl-b)));
}
#[test]
fn ui() {
trybuild::TestCases::new().compile_fail("tests/ui/*.rs");
}
}