use super::{PointerModifiers, WebEvent};
use crate::key_validation::bounded_name;
use std::io;
use wasm_bindgen::JsCast;
use web_sys::KeyboardEvent;
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct KeyboardMetadata {
key: String,
code: String,
repeat: bool,
modifiers: PointerModifiers,
trusted: bool,
}
impl KeyboardMetadata {
#[must_use]
pub fn key(&self) -> &str {
&self.key
}
#[must_use]
pub fn code(&self) -> &str {
&self.code
}
#[must_use]
pub const fn is_repeat(&self) -> bool {
self.repeat
}
#[must_use]
pub const fn modifiers(&self) -> PointerModifiers {
self.modifiers
}
#[must_use]
pub const fn is_trusted(&self) -> bool {
self.trusted
}
}
impl WebEvent {
pub fn keyboard_metadata(&self) -> io::Result<Option<KeyboardMetadata>> {
let Some(keyboard) = self.event.dyn_ref::<KeyboardEvent>() else {
return Ok(None);
};
Ok(Some(KeyboardMetadata {
key: bounded_name(keyboard.key())?,
code: bounded_name(keyboard.code())?,
repeat: keyboard.repeat(),
modifiers: keyboard_modifiers(keyboard),
trusted: self.is_trusted(),
}))
}
}
fn keyboard_modifiers(event: &KeyboardEvent) -> PointerModifiers {
PointerModifiers {
ctrl: event.ctrl_key(),
shift: event.shift_key(),
alt: event.alt_key(),
meta: event.meta_key(),
}
}