#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
#[non_exhaustive]
pub enum Keyboard {
Eof,
Key {
key: KeyCode,
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "Modifiers::is_empty")
)]
modifiers: Modifiers,
},
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
#[non_exhaustive]
pub enum KeyCode {
Char(char),
Enter,
Escape,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Modifiers {
#[cfg_attr(feature = "serde", serde(default, skip_serializing_if = "is_false"))]
pub ctrl: bool,
#[cfg_attr(feature = "serde", serde(default, skip_serializing_if = "is_false"))]
pub alt: bool,
#[cfg_attr(feature = "serde", serde(default, skip_serializing_if = "is_false"))]
pub shift: bool,
}
#[cfg(feature = "serde")]
fn is_false(b: &bool) -> bool {
!b
}
impl Modifiers {
#[must_use]
pub fn is_empty(&self) -> bool {
!self.ctrl && !self.alt && !self.shift
}
}