diff --git a/Cargo.lock b/Cargo.lock index 11627bb..433f582 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -29,6 +29,7 @@ version = "0.1.0" dependencies = [ "dotenv", "google-home", + "paste", "rumqttc", "serde", "serde_json", @@ -492,6 +493,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "paste" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1c2c742266c2f1041c914ba65355a83ae8747b05f208319784083583494b4b" + [[package]] name = "pin-project" version = "1.0.12" diff --git a/Cargo.toml b/Cargo.toml index 53ef255..13c17b3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,3 +11,7 @@ serde = { version ="1.0.149", features = ["derive"] } serde_json = "1.0.89" dotenv = "0.15.0" google-home = {path = "./google-home"} +paste = "1.0.10" + +[profile.release] +lto=true diff --git a/src/devices.rs b/src/devices.rs index 64c4513..bd1a938 100644 --- a/src/devices.rs +++ b/src/devices.rs @@ -6,39 +6,31 @@ use crate::{mqtt::Listener, state::StateOnOff}; pub use self::ikea_outlet::IkeaOutlet; -pub trait AsListener { - fn cast(&self) -> Option<&dyn Listener> { - None - } - fn cast_mut(&mut self) -> Option<&mut dyn Listener> { - None - } -} -impl AsListener for T { - fn cast(&self) -> Option<&dyn Listener> { - Some(self) - } - fn cast_mut(&mut self) -> Option<&mut dyn Listener> { - Some(self) - } +macro_rules! add_cast_for { + ($i:ident) => { + paste::paste! { + pub trait [< As $i>] { + fn cast(&self) -> Option<&dyn $i> { + None + } + fn cast_mut(&mut self) -> Option<&mut dyn $i> { + None + } + } + impl [< As $i>] for T { + fn cast(&self) -> Option<&dyn $i> { + Some(self) + } + fn cast_mut(&mut self) -> Option<&mut dyn $i> { + Some(self) + } + } + } + }; } -pub trait AsStateOnOff { - fn cast(&self) -> Option<&dyn StateOnOff> { - None - } - fn cast_mut(&mut self) -> Option<&mut dyn StateOnOff> { - None - } -} -impl AsStateOnOff for T { - fn cast(&self) -> Option<&dyn StateOnOff> { - Some(self) - } - fn cast_mut(&mut self) -> Option<&mut dyn StateOnOff> { - Some(self) - } -} +add_cast_for!(Listener); +add_cast_for!(StateOnOff); pub trait Device: AsListener + AsStateOnOff { fn get_identifier(&self) -> &str;