add structs for Thermometer and PowerSocket; add Device trait

This commit is contained in:
7 changed files with 130 additions and 10 deletions

View File

@@ -21,15 +21,15 @@
Для библиотеки:
- [x] Реализована в виде lib крейта.
- [ ] Опишите тип: умный термометр. Тип должен предоставлять следующий функционал:
- [ ] Конструктор, принимающий значения полей.
- [ ] Возвращать значение текущей температуры (произвольное число).
- [ ] Опишите тип: умная розетка. Тип должен предоставлять следующий функционал:
- [ ] Конструктор, принимающий значения полей.
- [ ] Включение/выключение + возможность узнать текущее состояние.
- [ ] Возвращать текущую мощность: если выключено — ноль, иначе произвольное число.
- [ ] Опишите тип: умное устройство. Тип должен содержать одно из устройств (умный термометр или розетку) и предоставлять следующий функционал:
- [ ] Выводить в стандартный вывод сообщение о состоянии устройства.
- [x] Опишите тип: умный термометр. Тип должен предоставлять следующий функционал:
- [x] Конструктор, принимающий значения полей.
- [x] Возвращать значение текущей температуры (произвольное число).
- [x] Опишите тип: умная розетка. Тип должен предоставлять следующий функционал:
- [x] Конструктор, принимающий значения полей.
- [x] Включение/выключение + возможность узнать текущее состояние.
- [x] Возвращать текущую мощность: если выключено — ноль, иначе произвольное число.
- [x] Опишите тип: умное устройство. Тип должен содержать одно из устройств (умный термометр или розетку) и предоставлять следующий функционал:
- [x] Выводить в стандартный вывод сообщение о состоянии устройства.
- [ ] Опишите тип: комната, содержащая массив умных устройств. Тип должен предоставлять следующий функционал:
- [ ] Конструктор, принимающий массив устройств.
- [ ] Можно получить ссылку на устройство по указанному индексу.

View File

@@ -0,0 +1,8 @@
#![allow(unused)]
mod power_socket;
mod thermometer;
trait Device {
fn print_status(&self);
}

View File

@@ -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 ]");
}
}

View File

@@ -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 ]");
}
}

1
smart-house/src/house.rs Normal file
View File

@@ -0,0 +1 @@

View File

@@ -1 +1,3 @@
mod device;
mod house;
mod room;

1
smart-house/src/room.rs Normal file
View File

@@ -0,0 +1 @@