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..d9ca68d --- /dev/null +++ b/smart-house/src/device.rs @@ -0,0 +1,8 @@ +#![allow(unused)] + +mod power_socket; +mod thermometer; + +trait Device { + fn print_status(&self); +} diff --git a/smart-house/src/device/power_socket.rs b/smart-house/src/device/power_socket.rs new file mode 100644 index 0000000..edc2907 --- /dev/null +++ b/smart-house/src/device/power_socket.rs @@ -0,0 +1,63 @@ +#![allow(unused)] + +use crate::device::Device; +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()) + } +} + +impl Device for PowerSocket { + fn print_status(&self) { + println!("{}", self.display()) + } +} + +#[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/device/thermometer.rs b/smart-house/src/device/thermometer.rs new file mode 100644 index 0000000..a63fb95 --- /dev/null +++ b/smart-house/src/device/thermometer.rs @@ -0,0 +1,45 @@ +#![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()) + } +} + +impl super::Device for Thermometer { + fn print_status(&self) { + println!("{}", self.display()) + } +} + +#[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 ]"); + } +} diff --git a/smart-house/src/house.rs b/smart-house/src/house.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/smart-house/src/house.rs @@ -0,0 +1 @@ + diff --git a/smart-house/src/lib.rs b/smart-house/src/lib.rs index 8b13789..57a9800 100644 --- a/smart-house/src/lib.rs +++ b/smart-house/src/lib.rs @@ -1 +1,3 @@ - +mod device; +mod house; +mod room; diff --git a/smart-house/src/room.rs b/smart-house/src/room.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/smart-house/src/room.rs @@ -0,0 +1 @@ +