From fd1540b63de8b7286b7607bbf910e2683cdfc103 Mon Sep 17 00:00:00 2001 From: Dreaded_X Date: Wed, 14 Dec 2022 05:33:13 +0100 Subject: [PATCH] Renamed from to cast_mut and added version that is not mutable --- src/devices.rs | 22 +++++++++++++++++----- src/main.rs | 2 +- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/devices.rs b/src/devices.rs index c6a42e0..64c4513 100644 --- a/src/devices.rs +++ b/src/devices.rs @@ -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 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 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> { diff --git a/src/main.rs b/src/main.rs index ee4ec5f..d9b8122 100644 --- a/src/main.rs +++ b/src/main.rs @@ -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));