Added macro to generate cast traits and impls automatically
This commit is contained in:
parent
fd1540b63d
commit
4de0b31ec8
7
Cargo.lock
generated
7
Cargo.lock
generated
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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<T: Device + Listener> 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<T: $i> [< 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<T: Device + StateOnOff> 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;
|
||||
|
|
Loading…
Reference in New Issue
Block a user