Use format macro instead of directly concating
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Dreaded_X 2023-01-20 16:44:49 +01:00
parent 8511cde67e
commit 6c8b73f60f
Signed by: Dreaded_X
GPG Key ID: 76BDEC4E165D8AD9
4 changed files with 12 additions and 9 deletions

View File

@ -140,7 +140,7 @@ impl PresenceDeviceConfig {
// @TODO This is not perfect, if the topic is some/+/thing/# this will fail
let offset = config.presence.topic.find('+').or(config.presence.topic.find('#')).unwrap();
let topic = config.presence.topic[..offset].to_owned() + class + "/" + identifier;
let topic = format!("{}/{class}/{identifier}", &config.presence.topic[..offset-1]);
trace!("Setting presence mqtt topic: {topic}");
self.mqtt = Some(MqttDeviceConfig { topic });
}
@ -245,9 +245,9 @@ impl Device {
Device::AudioSetup { mqtt, mixer, speakers } => {
trace!(id = identifier, "AudioSetup [{}]", identifier);
// Create the child devices
let mixer_id = identifier.to_owned() + ".mixer";
let mixer_id = format!("{}.mixer", identifier);
let mixer = (*mixer).create(&mixer_id, config, client.clone()).await?;
let speakers_id = identifier.to_owned() + ".speakers";
let speakers_id = format!("{}.speakers", identifier);
let speakers = (*speakers).create(&speakers_id, config, client.clone()).await?;
AudioSetup::build(&identifier, mqtt, mixer, speakers, client).await

View File

@ -48,7 +48,7 @@ pub fn start(mut presence_rx: presence::Receiver, mut light_sensor_rx: light_sen
impl OnPresence for DebugBridge {
async fn on_presence(&mut self, presence: bool) {
let message = PresenceMessage::new(presence);
let topic = self.topic.clone() + "/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))
@ -60,7 +60,7 @@ impl OnPresence for DebugBridge {
impl OnDarkness for DebugBridge {
async fn on_darkness(&mut self, dark: bool) {
let message = DarknessMessage::new(dark);
let topic = self.topic.clone() + "/darkness";
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))

View File

@ -23,11 +23,13 @@ pub struct AudioSetup {
impl AudioSetup {
pub async fn build(identifier: &str, mqtt: MqttDeviceConfig, mixer: DeviceBox, speakers: DeviceBox, client: AsyncClient) -> Result<Self, DeviceError> {
// We expect the children devices to implement the OnOff trait
let mixer_id = mixer.get_id().to_owned();
let mixer = AsOnOff::consume(mixer)
.ok_or_else(|| DeviceError::OnOffExpected(identifier.to_owned() + ".mixer"))?;
.ok_or_else(|| DeviceError::OnOffExpected(mixer_id))?;
let speakers_id = speakers.get_id().to_owned();
let speakers = AsOnOff::consume(speakers)
.ok_or_else(|| DeviceError::OnOffExpected(identifier.to_owned() + ".speakers"))?;
.ok_or_else(|| DeviceError::OnOffExpected(speakers_id))?;
client.subscribe(mqtt.topic.clone(), rumqttc::QoS::AtLeastOnce).await?;

View File

@ -37,10 +37,11 @@ impl IkeaOutlet {
async fn set_on(client: AsyncClient, topic: &str, on: bool) {
let message = OnOffMessage::new(on);
let topic = format!("{}/set", topic);
// @TODO Handle potential errors here
client.publish(topic.to_owned() + "/set", rumqttc::QoS::AtLeastOnce, false, serde_json::to_string(&message).unwrap())
client.publish(topic.clone(), rumqttc::QoS::AtLeastOnce, false, serde_json::to_string(&message).unwrap())
.await
.map_err(|err| warn!("Failed to update state on {topic}/set: {err}"))
.map_err(|err| warn!("Failed to update state on {topic}: {err}"))
.ok();
}