use std::fmt::Display; #[derive(Debug)] pub enum Device { Thermometer(super::Thermometer), PowerSocket(super::PowerSocket), } impl Device { pub fn display(&self) -> impl Display { match self { Device::Thermometer(thermometer) => { format!("DEV:{}", thermometer.display()) } Device::PowerSocket(power_socket) => { format!("DEV:{}", power_socket.display()) } } } pub fn print_status(&self) { println!("{}", self.display()); } pub fn get_name(&self) -> &str { match self { Device::Thermometer(thermometer) => thermometer.get_name(), Device::PowerSocket(power_socket) => power_socket.get_name(), } } } impl From for Device { fn from(value: super::Thermometer) -> Self { Device::Thermometer(value) } } impl From for Device { fn from(value: super::PowerSocket) -> Self { Device::PowerSocket(value) } } #[cfg(test)] mod tests { use super::*; use crate::{PowerSocket, Thermometer}; #[test] fn smoke_test() { let dev_thermometer = Device::Thermometer(Thermometer::new("Therm", 20.1)); let dev_power_socket = Device::PowerSocket(PowerSocket::new("PSoc", 11.2, false)); dev_thermometer.print_status(); dev_power_socket.print_status(); let Device::Thermometer(thermometer) = dev_thermometer else { unreachable!() }; let Device::PowerSocket(power_socket) = dev_power_socket else { unreachable!() }; assert_eq!(format!("{}", thermometer.display()), "Therm[ 20.1 ]"); assert_eq!(format!("{}", power_socket.display()), "PSoc[ OFF : 0.0 ]"); } #[test] fn display_test() { let dev_thermometer = Device::Thermometer(Thermometer::new("Therm", 20.1)); let dev_power_socket = Device::PowerSocket(PowerSocket::new("PSoc", 11.2, false)); assert_eq!(format!("{}", dev_thermometer.display()), "DEV:Therm[ 20.1 ]"); assert_eq!(format!("{}", dev_power_socket.display()), "DEV:PSoc[ OFF : 0.0 ]"); } }