use crate::light::Status; use rumqtt; use rumqtt::{MqttClient, QoS}; pub struct MqttUpdates { client: MqttClient, updates: crossbeam_channel::Receiver, } impl MqttUpdates { pub fn new(client: MqttClient, updates: crossbeam_channel::Receiver) -> Self { MqttUpdates { client, updates } } pub fn add_light(&mut self, id: &str, lampname: &str) -> Result<(), rumqtt::ClientError> { self.client.publish( format!("{}/lights", crate::MQTT_ID), QoS::AtLeastOnce, false, format!("{}:{}", id, lampname), )?; self.client.publish( format!("{}/{}/status/connected", crate::MQTT_ID, lampname), QoS::AtLeastOnce, false, "true", )?; self.client.subscribe( format!("{}/{}/command/power", crate::MQTT_ID, lampname), QoS::AtLeastOnce, )?; self.client.subscribe( format!("{}/{}/command/brightness", crate::MQTT_ID, lampname), QoS::AtLeastOnce, )?; Ok(()) } pub fn listen(&mut self) { while let Ok(status) = self.updates.recv() { match status { Status::New(light) => self.add_light(&light.id, &light.label).unwrap(), Status::Remove(_name) => unimplemented!(), Status::Update(update) => { let (detail, value) = update.status.unravel(); self.client .publish( format!("{}/{}/status/{}", crate::MQTT_ID, update.lampname, detail), QoS::AtLeastOnce, true, value, ) .unwrap(); } } } } }