diff --git a/Cargo.lock b/Cargo.lock index 0197e8e..d3a565f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -86,6 +86,7 @@ dependencies = [ "serde", "serde_derive", "serde_json", + "serde_repr", "tokio", "toml", ] @@ -714,6 +715,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_repr" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a5ec9fa74a20ebbe5d9ac23dac1fc96ba0ecfe9f50f2843b52e537b10fbcb4e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" diff --git a/Cargo.toml b/Cargo.toml index 8f129a4..7ec31fd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,6 +13,7 @@ regex = "1.7" reqwest = { version = "*", features = ["json", "rustls-tls"], default-features = false } serde = { version = "1", features = ["derive"] } serde_json = "*" +serde_repr = "*" tokio = { version = "1", features = ["macros", "rt-multi-thread"] } toml = "*" diff --git a/src/main.rs b/src/main.rs index b78e950..4d9f62d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,15 +6,24 @@ use std::time::Duration; use serde::Deserialize; use serde_json::json; +use serde_repr::Deserialize_repr; use tokio::task; use crate::checker::check_host; use crate::config::{CheckConfig, Config}; -#[derive(Deserialize)] +#[derive(Debug, Deserialize_repr, PartialEq)] +#[repr(u8)] +enum MouseButton { + Left = 1, + Middle = 2, + Right = 3, +} + +#[derive(Debug, Deserialize, PartialEq)] struct ClickEvent { name: String, - button: u8, + button: MouseButton, } async fn print_states(check_configs: &[CheckConfig]) { @@ -81,7 +90,7 @@ async fn main() { loop { if let Ok(click_event) = read_click_event() { // Ignore click event if not left mouse button - if click_event.button != 1 { + if click_event.button != MouseButton::Left { continue; }; if let Some(click_cmd) = get_click_cmd(click_event.name).await { @@ -105,3 +114,26 @@ async fn main() { let _r = tokio::join!(inputs, checks); } + +#[cfg(test)] +mod tests { + use crate::{ClickEvent, MouseButton}; + + #[test] + fn test_should_deserialize_click_event() { + let actual = serde_json::from_str::(r#"{"name": "test", "button": 1}"#); + let expected = ClickEvent { + name: "test".to_string(), + button: MouseButton::Left, + }; + + if actual.is_err() { + println!("{:?}", actual) + } + + assert!(actual.is_ok()); + + let actual = actual.unwrap(); + assert_eq!(actual, expected); + } +}