From 40c0ac514448c181b7a037f71836c39b8fae3fb3 Mon Sep 17 00:00:00 2001 From: Dreaded_X Date: Mon, 24 Apr 2023 04:28:17 +0200 Subject: [PATCH] Moved quasi-devices into the devices module and made event related device traits part of the event module --- src/config.rs | 9 ++++----- src/devices.rs | 16 ++++++++++++---- src/devices/audio_setup.rs | 4 ++-- src/devices/contact_sensor.rs | 8 ++++---- src/{ => devices}/debug_bridge.rs | 6 +++--- src/{ => devices}/hue_bridge.rs | 2 +- src/devices/ikea_outlet.rs | 4 ++-- src/{ => devices}/light_sensor.rs | 2 +- src/{ => devices}/presence.rs | 6 +++--- src/devices/wake_on_lan.rs | 2 +- src/event.rs | 29 +++++++++++++++++++++++++++++ src/lib.rs | 5 ----- src/main.rs | 5 +---- src/ntfy.rs | 2 +- src/traits.rs | 30 ------------------------------ 15 files changed, 64 insertions(+), 66 deletions(-) rename src/{ => devices}/debug_bridge.rs (95%) rename src/{ => devices}/hue_bridge.rs (97%) rename src/{ => devices}/light_sensor.rs (99%) rename src/{ => devices}/presence.rs (95%) delete mode 100644 src/traits.rs diff --git a/src/config.rs b/src/config.rs index d3ca438..61dc87d 100644 --- a/src/config.rs +++ b/src/config.rs @@ -12,13 +12,12 @@ use tracing::debug; use crate::{ auth::OpenIDConfig, - debug_bridge::DebugBridgeConfig, - devices::{AudioSetup, ContactSensor, Device, IkeaOutlet, KasaOutlet, WakeOnLAN}, + devices::{ + AudioSetup, ContactSensor, DebugBridgeConfig, Device, HueBridgeConfig, IkeaOutlet, + KasaOutlet, LightSensorConfig, PresenceConfig, WakeOnLAN, + }, error::{ConfigParseError, CreateDeviceError, MissingEnv}, event::EventChannel, - hue_bridge::HueBridgeConfig, - light_sensor::LightSensorConfig, - presence::PresenceConfig, }; #[derive(Debug, Deserialize)] diff --git a/src/devices.rs b/src/devices.rs index 1ebbd6c..e9d5111 100644 --- a/src/devices.rs +++ b/src/devices.rs @@ -1,13 +1,21 @@ mod audio_setup; mod contact_sensor; +mod debug_bridge; +mod hue_bridge; mod ikea_outlet; mod kasa_outlet; +mod light_sensor; +mod presence; mod wake_on_lan; pub use self::audio_setup::AudioSetup; pub use self::contact_sensor::ContactSensor; +pub use self::debug_bridge::{DebugBridge, DebugBridgeConfig}; +pub use self::hue_bridge::{HueBridge, HueBridgeConfig}; pub use self::ikea_outlet::IkeaOutlet; pub use self::kasa_outlet::KasaOutlet; +pub use self::light_sensor::{LightSensor, LightSensorConfig}; +pub use self::presence::{Presence, PresenceConfig, DEFAULT_PRESENCE}; pub use self::wake_on_lan::WakeOnLAN; use std::collections::HashMap; @@ -20,11 +28,11 @@ use tokio::sync::{mpsc, oneshot}; use tracing::{debug, error, instrument, trace}; use crate::{ + event::OnDarkness, + event::OnMqtt, + event::OnNotification, + event::OnPresence, event::{Event, EventChannel}, - traits::OnDarkness, - traits::OnMqtt, - traits::OnNotification, - traits::OnPresence, }; #[impl_cast::device(As: OnMqtt + OnPresence + OnDarkness + OnNotification + GoogleHomeDevice + OnOff)] diff --git a/src/devices/audio_setup.rs b/src/devices/audio_setup.rs index 87568c2..2bdaff8 100644 --- a/src/devices/audio_setup.rs +++ b/src/devices/audio_setup.rs @@ -8,9 +8,9 @@ use crate::{ config::{self, CreateDevice, MqttDeviceConfig}, error::CreateDeviceError, event::EventChannel, + event::OnMqtt, + event::OnPresence, messages::{RemoteAction, RemoteMessage}, - traits::OnMqtt, - traits::OnPresence, }; use super::{As, Device}; diff --git a/src/devices/contact_sensor.rs b/src/devices/contact_sensor.rs index 7fe0b8b..0505945 100644 --- a/src/devices/contact_sensor.rs +++ b/src/devices/contact_sensor.rs @@ -8,12 +8,12 @@ use tracing::{debug, error, trace, warn}; use crate::{ config::{CreateDevice, MqttDeviceConfig}, + devices::DEFAULT_PRESENCE, error::{CreateDeviceError, MissingWildcard}, event::EventChannel, + event::OnMqtt, + event::OnPresence, messages::{ContactMessage, PresenceMessage}, - presence, - traits::OnMqtt, - traits::OnPresence, }; use super::Device; @@ -94,7 +94,7 @@ impl CreateDevice for ContactSensor { mqtt: config.mqtt, presence, client: client.clone(), - overall_presence: presence::DEFAULT, + overall_presence: DEFAULT_PRESENCE, is_closed: true, handle: None, }) diff --git a/src/debug_bridge.rs b/src/devices/debug_bridge.rs similarity index 95% rename from src/debug_bridge.rs rename to src/devices/debug_bridge.rs index eae1063..10aa63c 100644 --- a/src/debug_bridge.rs +++ b/src/devices/debug_bridge.rs @@ -3,12 +3,12 @@ use rumqttc::AsyncClient; use serde::Deserialize; use tracing::warn; +use crate::devices::Device; +use crate::event::OnDarkness; +use crate::event::OnPresence; use crate::{ config::MqttDeviceConfig, - devices::Device, messages::{DarknessMessage, PresenceMessage}, - traits::OnDarkness, - traits::OnPresence, }; #[derive(Debug, Deserialize)] diff --git a/src/hue_bridge.rs b/src/devices/hue_bridge.rs similarity index 97% rename from src/hue_bridge.rs rename to src/devices/hue_bridge.rs index 5435f78..bd70ebb 100644 --- a/src/hue_bridge.rs +++ b/src/devices/hue_bridge.rs @@ -4,7 +4,7 @@ use async_trait::async_trait; use serde::{Deserialize, Serialize}; use tracing::{error, trace, warn}; -use crate::{devices::Device, traits::OnDarkness, traits::OnPresence}; +use crate::{devices::Device, event::OnDarkness, event::OnPresence}; #[derive(Debug)] pub enum Flag { diff --git a/src/devices/ikea_outlet.rs b/src/devices/ikea_outlet.rs index e3a0e79..c0d8588 100644 --- a/src/devices/ikea_outlet.rs +++ b/src/devices/ikea_outlet.rs @@ -17,9 +17,9 @@ use crate::config::{CreateDevice, InfoConfig, MqttDeviceConfig}; use crate::devices::Device; use crate::error::CreateDeviceError; use crate::event::EventChannel; +use crate::event::OnMqtt; +use crate::event::OnPresence; use crate::messages::OnOffMessage; -use crate::traits::OnMqtt; -use crate::traits::OnPresence; #[derive(Debug, Clone, Deserialize, PartialEq, Eq, Copy)] pub enum OutletType { diff --git a/src/light_sensor.rs b/src/devices/light_sensor.rs similarity index 99% rename from src/light_sensor.rs rename to src/devices/light_sensor.rs index 82328d2..8c650be 100644 --- a/src/light_sensor.rs +++ b/src/devices/light_sensor.rs @@ -6,9 +6,9 @@ use tracing::{debug, trace, warn}; use crate::{ config::MqttDeviceConfig, devices::Device, + event::OnMqtt, event::{self, Event, EventChannel}, messages::BrightnessMessage, - traits::OnMqtt, }; #[derive(Debug, Clone, Deserialize)] diff --git a/src/presence.rs b/src/devices/presence.rs similarity index 95% rename from src/presence.rs rename to src/devices/presence.rs index cdbdd16..01a8487 100644 --- a/src/presence.rs +++ b/src/devices/presence.rs @@ -8,9 +8,9 @@ use tracing::{debug, warn}; use crate::{ config::MqttDeviceConfig, devices::Device, + event::OnMqtt, event::{self, Event, EventChannel}, messages::PresenceMessage, - traits::OnMqtt, }; #[derive(Debug, Deserialize)] @@ -19,7 +19,7 @@ pub struct PresenceConfig { pub mqtt: MqttDeviceConfig, } -pub const DEFAULT: bool = false; +pub const DEFAULT_PRESENCE: bool = false; #[derive(Debug)] pub struct Presence { @@ -35,7 +35,7 @@ impl Presence { tx: event_channel.get_tx(), mqtt: config.mqtt, devices: HashMap::new(), - current_overall_presence: DEFAULT, + current_overall_presence: DEFAULT_PRESENCE, } } } diff --git a/src/devices/wake_on_lan.rs b/src/devices/wake_on_lan.rs index fb78395..8f5bd84 100644 --- a/src/devices/wake_on_lan.rs +++ b/src/devices/wake_on_lan.rs @@ -17,8 +17,8 @@ use crate::{ config::{CreateDevice, InfoConfig, MqttDeviceConfig}, error::CreateDeviceError, event::EventChannel, + event::OnMqtt, messages::ActivateMessage, - traits::OnMqtt, }; use super::Device; diff --git a/src/event.rs b/src/event.rs index c06ddaf..c9f8b67 100644 --- a/src/event.rs +++ b/src/event.rs @@ -1,7 +1,11 @@ +use async_trait::async_trait; use rumqttc::Publish; use tokio::sync::mpsc; +use impl_cast::device_trait; + use crate::ntfy; +use crate::ntfy::Notification; #[derive(Debug, Clone)] pub enum Event { @@ -28,3 +32,28 @@ impl EventChannel { self.0.clone() } } + +#[async_trait] +#[device_trait] +pub trait OnMqtt { + fn topics(&self) -> Vec<&str>; + async fn on_mqtt(&mut self, message: Publish); +} + +#[async_trait] +#[device_trait] +pub trait OnPresence { + async fn on_presence(&mut self, presence: bool); +} + +#[async_trait] +#[device_trait] +pub trait OnDarkness { + async fn on_darkness(&mut self, dark: bool); +} + +#[async_trait] +#[device_trait] +pub trait OnNotification { + async fn on_notification(&mut self, notification: Notification); +} diff --git a/src/lib.rs b/src/lib.rs index de9558f..413d9b6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,14 +2,9 @@ #![feature(specialization)] pub mod auth; pub mod config; -pub mod debug_bridge; pub mod devices; pub mod error; pub mod event; -pub mod hue_bridge; -pub mod light_sensor; pub mod messages; pub mod mqtt; pub mod ntfy; -pub mod presence; -pub mod traits; diff --git a/src/main.rs b/src/main.rs index 1922e91..749119c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,14 +8,11 @@ use axum::{ use automation::{ auth::{OpenIDConfig, User}, config::Config, - debug_bridge::DebugBridge, devices, + devices::{DebugBridge, HueBridge, LightSensor, Presence}, error::ApiError, - hue_bridge::HueBridge, - light_sensor::LightSensor, mqtt, ntfy::Ntfy, - presence::Presence, }; use dotenvy::dotenv; use futures::future::join_all; diff --git a/src/ntfy.rs b/src/ntfy.rs index 81b5e96..7df10d8 100644 --- a/src/ntfy.rs +++ b/src/ntfy.rs @@ -10,7 +10,7 @@ use crate::{ config::NtfyConfig, devices::Device, event::{self, Event, EventChannel}, - traits::{OnNotification, OnPresence}, + event::{OnNotification, OnPresence}, }; pub type Sender = mpsc::Sender; diff --git a/src/traits.rs b/src/traits.rs deleted file mode 100644 index 2cd48c1..0000000 --- a/src/traits.rs +++ /dev/null @@ -1,30 +0,0 @@ -use async_trait::async_trait; -use impl_cast::device_trait; -use rumqttc::Publish; - -use crate::ntfy::Notification; - -#[async_trait] -#[device_trait] -pub trait OnMqtt { - fn topics(&self) -> Vec<&str>; - async fn on_mqtt(&mut self, message: Publish); -} - -#[async_trait] -#[device_trait] -pub trait OnPresence { - async fn on_presence(&mut self, presence: bool); -} - -#[async_trait] -#[device_trait] -pub trait OnDarkness { - async fn on_darkness(&mut self, dark: bool); -} - -#[async_trait] -#[device_trait] -pub trait OnNotification { - async fn on_notification(&mut self, notification: Notification); -}