#[cfg(target_os = "linux")]
mod linux;
#[cfg(target_os = "windows")]
mod windows;
#[cfg(target_os = "macos")]
mod macos;
use std::fmt;
use std::io;
#[doc(hidden)]
enum LockKeyHandle {}
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub enum LockKeyState {
Enabled,
Disabled,
}
impl LockKeyState {
pub fn toggle(self) -> Self {
match self {
Self::Enabled => Self::Disabled,
Self::Disabled => Self::Enabled,
}
}
}
impl From<bool> for LockKeyState {
fn from(val: bool) -> Self {
if val {
LockKeyState::Enabled
} else {
LockKeyState::Disabled
}
}
}
impl From<LockKeyState> for bool {
fn from(val: LockKeyState) -> Self {
val == LockKeyState::Enabled
}
}
impl fmt::Display for LockKeyState {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(match *self {
LockKeyState::Enabled => "enabled",
LockKeyState::Disabled => "disabled",
})
}
}
pub type LockKeyResult = io::Result<LockKeyState>;
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub enum LockKeys {
CapitalLock,
NumberLock,
ScrollingLock,
}
pub struct LockKey {
handle: *mut LockKeyHandle,
}
impl fmt::Debug for LockKey {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt::Debug::fmt(&self.handle, f)
}
}
pub trait LockKeyWrapper {
fn new() -> Self;
fn set(&self, key: LockKeys, state: LockKeyState) -> LockKeyResult;
fn enable(&self, key: LockKeys) -> LockKeyResult;
fn disable(&self, key: LockKeys) -> LockKeyResult;
fn toggle(&self, key: LockKeys) -> LockKeyResult;
fn state(&self, key: LockKeys) -> LockKeyResult;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn set() {
let lock_key = LockKey::new();
let old_lock_key_state = lock_key.state(LockKeys::CapitalLock).unwrap();
assert_eq!(
lock_key
.set(LockKeys::CapitalLock, LockKeyState::Disabled)
.unwrap(),
LockKeyState::Disabled
);
assert_eq!(
lock_key.state(LockKeys::CapitalLock).unwrap(),
LockKeyState::Disabled
);
assert_eq!(
lock_key
.set(LockKeys::CapitalLock, LockKeyState::Enabled)
.unwrap(),
LockKeyState::Enabled
);
assert_eq!(
lock_key.state(LockKeys::CapitalLock).unwrap(),
LockKeyState::Enabled
);
lock_key
.set(LockKeys::CapitalLock, old_lock_key_state)
.unwrap();
}
#[test]
fn enable() {
let lock_key = LockKey::new();
let old_lock_key_state = lock_key.state(LockKeys::CapitalLock).unwrap();
lock_key.disable(LockKeys::CapitalLock).unwrap();
assert_eq!(
lock_key.state(LockKeys::CapitalLock).unwrap(),
LockKeyState::Disabled
);
assert_eq!(
lock_key.enable(LockKeys::CapitalLock).unwrap(),
LockKeyState::Enabled
);
assert_eq!(
lock_key.state(LockKeys::CapitalLock).unwrap(),
LockKeyState::Enabled
);
lock_key
.set(LockKeys::CapitalLock, old_lock_key_state)
.unwrap();
}
#[test]
fn disable() {
let lock_key = LockKey::new();
let old_lock_key_state = lock_key.state(LockKeys::CapitalLock).unwrap();
lock_key.enable(LockKeys::CapitalLock).unwrap();
assert_eq!(
lock_key.state(LockKeys::CapitalLock).unwrap(),
LockKeyState::Enabled
);
assert_eq!(
lock_key.disable(LockKeys::CapitalLock).unwrap(),
LockKeyState::Disabled
);
assert_eq!(
lock_key.state(LockKeys::CapitalLock).unwrap(),
LockKeyState::Disabled
);
lock_key
.set(LockKeys::CapitalLock, old_lock_key_state)
.unwrap();
}
#[test]
fn toggle() {
let lock_key = LockKey::new();
let old_lock_key_state = lock_key.state(LockKeys::CapitalLock).unwrap();
lock_key.enable(LockKeys::CapitalLock).unwrap();
assert_eq!(
lock_key.toggle(LockKeys::CapitalLock).unwrap(),
LockKeyState::Enabled
);
assert_eq!(
lock_key.toggle(LockKeys::CapitalLock).unwrap(),
LockKeyState::Disabled
);
lock_key
.set(LockKeys::CapitalLock, old_lock_key_state)
.unwrap();
}
#[test]
fn state() {
let lock_key = LockKey::new();
let old_lock_key_state = lock_key.state(LockKeys::CapitalLock).unwrap();
lock_key.enable(LockKeys::CapitalLock).unwrap();
assert_eq!(
lock_key.state(LockKeys::CapitalLock).unwrap(),
LockKeyState::Enabled
);
lock_key.disable(LockKeys::CapitalLock).unwrap();
assert_eq!(
lock_key.toggle(LockKeys::CapitalLock).unwrap(),
LockKeyState::Disabled
);
lock_key
.set(LockKeys::CapitalLock, old_lock_key_state)
.unwrap();
}
}