From 0f68dc3f0655577740f113fcd70ec023bddcbb46 Mon Sep 17 00:00:00 2001 From: Sebastian Kuzminsky Date: Tue, 13 May 2025 22:08:55 -0600 Subject: [PATCH] `set` by name, not by index --- src/bin/cli.rs | 8 ++++---- src/system.rs | 13 +++++++++---- src/tasmota.rs | 6 +++--- src/types.rs | 2 ++ 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/bin/cli.rs b/src/bin/cli.rs index 533519b..2ca186d 100644 --- a/src/bin/cli.rs +++ b/src/bin/cli.rs @@ -2,7 +2,7 @@ use clap::{Parser, Subcommand}; #[derive(Parser)] pub struct PowerCommand { - index: usize, + name: String, #[command(subcommand)] state: power::types::PowerState, } @@ -23,9 +23,9 @@ impl Commands { }), Self::Set(command) => { // let c = Controller::new_from_file(config_file).unwrap(); - tokio::spawn(async move { - s.try_set_power(command.index, command.state).await.unwrap(); - }) + tokio::spawn( + async move { s.try_set_power(&command.name, command.state).await.unwrap() }, + ) } }; handle.await.unwrap(); diff --git a/src/system.rs b/src/system.rs index e917d22..03c8de7 100644 --- a/src/system.rs +++ b/src/system.rs @@ -50,9 +50,14 @@ impl System { Ok(()) } - pub async fn try_set_power(&self, index: usize, state: types::PowerState) -> Result<(), Error> { - //TODO: check bounds - self.components[index].set_power(state).await?; - Ok(()) + pub async fn try_set_power(&self, name: &str, state: types::PowerState) -> Result<(), Error> { + match self + .components + .iter() + .find(|&component| component.config.name == name) + { + Some(component) => component.set_power(state).await, + None => Err(Error::DeviceNameNotFound(String::from(name))), + } } } diff --git a/src/tasmota.rs b/src/tasmota.rs index b8bae8a..8498dde 100644 --- a/src/tasmota.rs +++ b/src/tasmota.rs @@ -29,8 +29,8 @@ pub struct StatusResponse { #[derive(Deserialize, Clone)] pub struct TasmotaInterfaceConfig { - name: String, - target: String, + pub name: String, + pub target: String, } impl TasmotaInterfaceConfig { @@ -41,7 +41,7 @@ impl TasmotaInterfaceConfig { } pub struct TasmotaInterface { - config: TasmotaInterfaceConfig, + pub config: TasmotaInterfaceConfig, client: Client, } diff --git a/src/types.rs b/src/types.rs index d25711e..f9c25c6 100644 --- a/src/types.rs +++ b/src/types.rs @@ -12,6 +12,8 @@ pub enum Error { RequestError(#[from] reqwest::Error), #[error("JSON Parse error")] JsonParseError(#[from] serde_json::Error), + #[error("device {0} not found")] + DeviceNameNotFound(String), } #[derive(Serialize, Deserialize, Parser, Clone)]