use serde::Serialize;
use crate::bindings::{Discriminator, KeyCode, KeyEvent, KeyModifier, MouseType};
#[derive(Hash, PartialEq, Eq, Serialize, Debug, Clone)]
#[serde(tag = "type")]
pub enum Subscription {
#[serde(rename = "everything")]
Everything,
#[serde(rename = "all key presses")]
AllKeyPresses,
#[serde(rename = "all mouse events")]
AllMouseEvents,
#[serde(rename = "all messages")]
AllMessages,
#[serde(rename = "specific key press")]
SpecificKeyPress { key: KeyEvent },
#[serde(rename = "specific key modifier")]
SpecificKeyModifier { modifier: KeyModifier },
#[serde(rename = "specific key code")]
SpecificKeyCode { code: KeyCode },
#[serde(rename = "specific mouse event")]
SpecificMouseEvent { mouse: MouseType },
#[serde(rename = "specific message")]
SpecificMessage { source: Discriminator },
#[serde(rename = "specific message tag")]
SpecificMessageTag { tag: String },
#[serde(rename = "screen resize")]
ScreenResize,
#[serde(rename = "focused")]
Focused,
#[serde(rename = "unfocused")]
Unfocused,
#[serde(rename = "multiple")]
Multiple {
subs: Vec<(Subscription, Option<u32>)>,
},
}
impl Subscription {
pub fn specific_keypress(key: KeyEvent) -> Self {
Self::SpecificKeyPress { key }
}
pub fn specific_keycode(code: KeyCode) -> Self {
Self::SpecificKeyCode { code }
}
pub fn specific_keymodifier(modifier: KeyModifier) -> Self {
Self::SpecificKeyModifier { modifier }
}
pub fn specific_mouse(mousetype: MouseType) -> Self {
Self::SpecificMouseEvent { mouse: mousetype }
}
pub fn specific_message(source: Discriminator) -> Self {
Self::SpecificMessage { source }
}
pub fn specific_message_tag(tag: String) -> Self {
Self::SpecificMessageTag { tag }
}
pub fn with_priority(self, priority: u32) -> (Self, Option<u32>) {
(self, Some(priority))
}
}
impl From<Subscription> for (Subscription, Option<u32>) {
fn from(value: Subscription) -> Self {
(value, None)
}
}