From 4018f77bad879a593e761c319cda92018abb77d8 Mon Sep 17 00:00:00 2001 From: Alexander Baranov Date: Wed, 17 Dec 2025 19:00:52 +0300 Subject: [PATCH] add Thermometer and PowerSocket structs and Device enum --- smart-house/README.md | 18 +++++------ smart-house/src/device.rs | 55 ++++++++++++++++++++++++++++++++ smart-house/src/lib.rs | 6 ++++ smart-house/src/power_socket.rs | 56 +++++++++++++++++++++++++++++++++ smart-house/src/thermometer.rs | 39 +++++++++++++++++++++++ 5 files changed, 165 insertions(+), 9 deletions(-) create mode 100644 smart-house/src/device.rs create mode 100644 smart-house/src/power_socket.rs create mode 100644 smart-house/src/thermometer.rs diff --git a/smart-house/README.md b/smart-house/README.md index 56ec72f..c3e3f7e 100644 --- a/smart-house/README.md +++ b/smart-house/README.md @@ -21,15 +21,15 @@ Для библиотеки: - [x] Реализована в виде lib крейта. -- [ ] Опишите тип: умный термометр. Тип должен предоставлять следующий функционал: - - [ ] Конструктор, принимающий значения полей. - - [ ] Возвращать значение текущей температуры (произвольное число). -- [ ] Опишите тип: умная розетка. Тип должен предоставлять следующий функционал: - - [ ] Конструктор, принимающий значения полей. - - [ ] Включение/выключение + возможность узнать текущее состояние. - - [ ] Возвращать текущую мощность: если выключено — ноль, иначе произвольное число. -- [ ] Опишите тип: умное устройство. Тип должен содержать одно из устройств (умный термометр или розетку) и предоставлять следующий функционал: - - [ ] Выводить в стандартный вывод сообщение о состоянии устройства. +- [x] Опишите тип: умный термометр. Тип должен предоставлять следующий функционал: + - [x] Конструктор, принимающий значения полей. + - [x] Возвращать значение текущей температуры (произвольное число). +- [x] Опишите тип: умная розетка. Тип должен предоставлять следующий функционал: + - [x] Конструктор, принимающий значения полей. + - [x] Включение/выключение + возможность узнать текущее состояние. + - [x] Возвращать текущую мощность: если выключено — ноль, иначе произвольное число. +- [x] Опишите тип: умное устройство. Тип должен содержать одно из устройств (умный термометр или розетку) и предоставлять следующий функционал: + - [x] Выводить в стандартный вывод сообщение о состоянии устройства. - [ ] Опишите тип: комната, содержащая массив умных устройств. Тип должен предоставлять следующий функционал: - [ ] Конструктор, принимающий массив устройств. - [ ] Можно получить ссылку на устройство по указанному индексу. diff --git a/smart-house/src/device.rs b/smart-house/src/device.rs new file mode 100644 index 0000000..b77c02c --- /dev/null +++ b/smart-house/src/device.rs @@ -0,0 +1,55 @@ +use std::fmt::Display; + +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()); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{PowerSocket, Thermometer}; + + #[test] + fn smoke_test() { + let dev_thermometer = Device::Thermometer(Thermometer::new(20.1)); + let dev_power_socket = Device::PowerSocket(PowerSocket::new(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()), "Thermometer[ 20.1 ]"); + assert_eq!(format!("{}", power_socket.display()), "PowerSocket[ OFF : 0.0 ]"); + } + + #[test] + fn display_test() { + let dev_thermometer = Device::Thermometer(Thermometer::new(20.1)); + let dev_power_socket = Device::PowerSocket(PowerSocket::new(11.2, false)); + + assert_eq!(format!("{}", dev_thermometer.display()), "DEV:Thermometer[ 20.1 ]"); + assert_eq!(format!("{}", dev_power_socket.display()), "DEV:PowerSocket[ OFF : 0.0 ]"); + } +} diff --git a/smart-house/src/lib.rs b/smart-house/src/lib.rs index 8b13789..882418f 100644 --- a/smart-house/src/lib.rs +++ b/smart-house/src/lib.rs @@ -1 +1,7 @@ +mod device; +mod power_socket; +mod thermometer; +pub use device::Device; +pub use power_socket::PowerSocket; +pub use thermometer::Thermometer; diff --git a/smart-house/src/power_socket.rs b/smart-house/src/power_socket.rs new file mode 100644 index 0000000..7e0fdc4 --- /dev/null +++ b/smart-house/src/power_socket.rs @@ -0,0 +1,56 @@ +#![allow(unused)] + +use std::fmt::Display; + +pub struct PowerSocket { + power_rate: f32, + on: bool, +} + +impl PowerSocket { + pub fn new(power_rate: f32, on: bool) -> Self { + Self { power_rate, on } + } + + pub fn is_on(&self) -> bool { + self.on + } + + pub fn set_on(&mut self, on: bool) { + self.on = on + } + + pub fn get_power(&self) -> f32 { + if self.on { self.power_rate } else { 0.0 } + } + + pub fn display(&self) -> impl Display { + let state = if self.is_on() { "ON" } else { "OFF" }; + format!("PowerSocket[ {} : {:02.1} ]", state, self.get_power()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn smoke_test() { + let mut power_socket = PowerSocket::new(12.4, false); + assert_eq!(power_socket.power_rate, 12.4); + assert!(!power_socket.on); + assert!(!power_socket.is_on()); + assert_eq!(power_socket.get_power(), 0.0); + + power_socket.set_on(true); + assert!(power_socket.is_on()); + assert_eq!(power_socket.get_power(), 12.4); + } + + #[test] + fn display_test() { + assert_eq!(format!("{}", PowerSocket::new(11.549, false).display()), "PowerSocket[ OFF : 0.0 ]"); + assert_eq!(format!("{}", PowerSocket::new(11.549, true).display()), "PowerSocket[ ON : 11.5 ]"); + assert_eq!(format!("{}", PowerSocket::new(11.550, true).display()), "PowerSocket[ ON : 11.6 ]"); + } +} diff --git a/smart-house/src/thermometer.rs b/smart-house/src/thermometer.rs new file mode 100644 index 0000000..8a195e3 --- /dev/null +++ b/smart-house/src/thermometer.rs @@ -0,0 +1,39 @@ +#![allow(unused)] + +use std::fmt::Display; + +pub struct Thermometer { + temperature: f32, +} + +impl Thermometer { + pub fn new(temperature: f32) -> Self { + Self { temperature } + } + + pub fn get_temperature(&self) -> f32 { + self.temperature + } + + pub fn display(&self) -> impl Display { + format!("Thermometer[ {:02.1} ]", self.get_temperature()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn smoke_test() { + let thermometer = Thermometer::new(20.0); + assert_eq!(thermometer.temperature, 20.0); + assert_eq!(thermometer.get_temperature(), 20.0); + } + + #[test] + fn display_test() { + assert_eq!(format!("{}", Thermometer::new(19.550).display()), "Thermometer[ 19.5 ]"); + assert_eq!(format!("{}", Thermometer::new(19.551).display()), "Thermometer[ 19.6 ]"); + } +}