diff --git a/smart-house/src/builders.rs b/smart-house/src/builders.rs new file mode 100644 index 0000000..71e797c --- /dev/null +++ b/smart-house/src/builders.rs @@ -0,0 +1,51 @@ +use crate::{Device, House, Room}; +use std::collections::HashMap; + +struct HouseBuilder { + rooms: HashMap, +} + +impl HouseBuilder { + fn new() -> Self { + Self { + rooms: HashMap::new() + } + } + + fn build(self) -> House { + House::new(self.rooms) + } + + fn add_room(self, name: &str) -> RoomBuilder { + RoomBuilder { + parent: self, + name: name.to_string(), + devices: HashMap::new() + } + } +} + +struct RoomBuilder { + parent: HouseBuilder, + name: String, + devices: HashMap, +} + +impl RoomBuilder { + + fn add_device(mut self, name: &str, device: Device) -> Self { + self.devices.insert(name.to_string(), device); + self + } + + fn add_room(mut self, name: &str) -> RoomBuilder { + self.parent.rooms.insert(self.name, Room::new(self.devices)); + self.parent.add_room(name) + } + + fn build(mut self) -> House { + self.parent.rooms.insert(self.name, Room::new(self.devices)); + self.parent.build() + } + +} diff --git a/smart-house/src/lib.rs b/smart-house/src/lib.rs index 0171d36..77b82da 100644 --- a/smart-house/src/lib.rs +++ b/smart-house/src/lib.rs @@ -4,6 +4,7 @@ mod house; mod power_socket; #[macro_use] mod room; +mod builders; mod print_status; mod thermometer;