Renamed from to cast_mut and added version that is not mutable

This commit is contained in:
Dreaded_X 2022-12-14 05:33:13 +01:00
parent 36cd0e9b61
commit fd1540b63d
Signed by: Dreaded_X
GPG Key ID: 76BDEC4E165D8AD9
2 changed files with 18 additions and 6 deletions

View File

@ -7,23 +7,35 @@ use crate::{mqtt::Listener, state::StateOnOff};
pub use self::ikea_outlet::IkeaOutlet;
pub trait AsListener {
fn from(&mut self) -> Option<&mut dyn Listener> {
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 from(&mut self) -> Option<&mut dyn Listener> {
fn cast(&self) -> Option<&dyn Listener> {
Some(self)
}
fn cast_mut(&mut self) -> Option<&mut dyn Listener> {
Some(self)
}
}
pub trait AsStateOnOff {
fn from(&mut self) -> Option<&mut dyn StateOnOff> {
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 from(&mut self) -> Option<&mut dyn StateOnOff> {
fn cast(&self) -> Option<&dyn StateOnOff> {
Some(self)
}
fn cast_mut(&mut self) -> Option<&mut dyn StateOnOff> {
Some(self)
}
}
@ -46,7 +58,7 @@ impl Devices {
}
pub fn get_listeners(&mut self) -> Vec<&mut dyn Listener> {
self.devices.iter_mut().filter_map(|(_, device)| AsListener::from(device.as_mut())).collect()
self.devices.iter_mut().filter_map(|(_, device)| AsListener::cast_mut(device.as_mut())).collect()
}
pub fn get_device(&mut self, name: &str) -> Option<&mut dyn Device> {

View File

@ -35,7 +35,7 @@ fn main() {
let mut notifier = Notifier::new();
// Update the state of the kettle
AsStateOnOff::from(devices.borrow_mut().get_device("kitchen/kettle").unwrap()).unwrap().set_state(false);
AsStateOnOff::cast_mut(devices.borrow_mut().get_device("kitchen/kettle").unwrap()).unwrap().set_state(false);
notifier.add_listener(Rc::downgrade(&devices));