tauri-plugin-prevent-default 5.0.0

Disable default browser shortcuts
Documentation
use crate::shortcut::{ModifierKey, PointerEvent};
use itertools::Itertools;

pub(crate) fn keyboard(key: &str, modifiers: &[ModifierKey]) -> String {
  let mut buf = String::from("keyboard:");
  let mod_len = modifiers.len().saturating_mul(6);
  buf.reserve(key.len().saturating_add(mod_len));

  for modifier in modifiers.iter().unique().sorted() {
    match modifier {
      ModifierKey::CtrlKey => buf.push_str("ctrl+"),
      ModifierKey::ShiftKey => buf.push_str("shift+"),
      ModifierKey::AltKey => buf.push_str("alt+"),
      ModifierKey::MetaKey => buf.push_str("meta+"),
    }
  }

  buf.push_str(&key.to_lowercase());
  buf
}

pub(crate) fn pointer(event: PointerEvent) -> String {
  format!("pointer:{event}")
}

#[cfg(test)]
mod test {
  use super::keyboard as k;
  use super::pointer as p;
  use crate::shortcut::ModifierKey::{AltKey, CtrlKey, MetaKey, ShiftKey};
  use crate::shortcut::PointerEvent;

  #[test]
  #[rustfmt::skip]
  fn display_keyboard() {
    assert_eq!(
      k("A", &[]),
      "keyboard:a"
    );
    assert_eq!(
      k("A", &[CtrlKey]),
      "keyboard:ctrl+a"
    );
    assert_eq!(
      k("A", &[ShiftKey, CtrlKey]),
      "keyboard:ctrl+shift+a"
    );
    assert_eq!(
      k("A", &[MetaKey, ShiftKey]),
      "keyboard:shift+meta+a"
    );
    assert_eq!(
      k("A", &[MetaKey, ShiftKey, CtrlKey]),
      "keyboard:ctrl+shift+meta+a"
    );
    assert_eq!(
      k("A", &[ShiftKey, AltKey, CtrlKey]),
      "keyboard:ctrl+shift+alt+a"
    );
    assert_eq!(
      k("A", &[ShiftKey, AltKey, CtrlKey, CtrlKey]),
      "keyboard:ctrl+shift+alt+a"
    );
    assert_eq!(
      k("A", &[MetaKey, ShiftKey, AltKey, CtrlKey]),
      "keyboard:ctrl+shift+alt+meta+a"
    );
    assert_eq!(
      k("A", &[ShiftKey, AltKey, CtrlKey, CtrlKey, ShiftKey]),
      "keyboard:ctrl+shift+alt+a"
    );
    assert_eq!(
      k("A", &[ShiftKey, MetaKey, AltKey, CtrlKey, MetaKey]),
      "keyboard:ctrl+shift+alt+meta+a"
    );
  }

  #[test]
  fn display_pointer() {
    assert_eq!(p(PointerEvent::ContextMenu), "pointer:contextmenu");
  }
}