automation_rs/src/debug_bridge.rs
Dreaded_X 3645b53f7c
All checks were successful
continuous-integration/drone/push Build is passing
Applied rust fmt
2023-04-10 01:33:39 +02:00

105 lines
2.7 KiB
Rust

use async_trait::async_trait;
use rumqttc::AsyncClient;
use tracing::warn;
use crate::{
config::DebugBridgeConfig,
light_sensor::{self, OnDarkness},
mqtt::{DarknessMessage, PresenceMessage},
presence::{self, OnPresence},
};
struct DebugBridge {
topic: String,
client: AsyncClient,
}
impl DebugBridge {
pub fn new(topic: &str, client: AsyncClient) -> Self {
Self {
topic: topic.to_owned(),
client,
}
}
}
pub fn start(
mut presence_rx: presence::Receiver,
mut light_sensor_rx: light_sensor::Receiver,
config: &DebugBridgeConfig,
client: AsyncClient,
) {
let mut debug_bridge = DebugBridge::new(&config.topic, client);
tokio::spawn(async move {
loop {
tokio::select! {
res = presence_rx.changed() => {
if res.is_err() {
break;
}
let presence = *presence_rx.borrow();
debug_bridge.on_presence(presence).await;
}
res = light_sensor_rx.changed() => {
if res.is_err() {
break;
}
let darkness = *light_sensor_rx.borrow();
debug_bridge.on_darkness(darkness).await;
}
}
}
unreachable!("Did not expect this");
});
}
#[async_trait]
impl OnPresence for DebugBridge {
async fn on_presence(&mut self, presence: bool) {
let message = PresenceMessage::new(presence);
let topic = format!("{}/presence", self.topic);
self.client
.publish(
topic,
rumqttc::QoS::AtLeastOnce,
true,
serde_json::to_string(&message).unwrap(),
)
.await
.map_err(|err| {
warn!(
"Failed to update presence on {}/presence: {err}",
self.topic
)
})
.ok();
}
}
#[async_trait]
impl OnDarkness for DebugBridge {
async fn on_darkness(&mut self, dark: bool) {
let message = DarknessMessage::new(dark);
let topic = format!("{}/darkness", self.topic);
self.client
.publish(
topic,
rumqttc::QoS::AtLeastOnce,
true,
serde_json::to_string(&message).unwrap(),
)
.await
.map_err(|err| {
warn!(
"Failed to update presence on {}/presence: {err}",
self.topic
)
})
.ok();
}
}