use std::collections::HashMap; use std::io; use std::net::SocketAddr; use log::{info, trace}; use domo_proto::data_types::DataType; use domo_proto::identifier::Identifier; pub struct Device { /// Device identifier pub device_id: Identifier, /// Device socket address pub socket_addr: SocketAddr, /// List of properties and last state. pub properties: HashMap } pub struct Devices { devices: HashMap } impl Devices { pub fn new() -> Self { Self { devices: HashMap::new() } } pub fn add_device_random(&mut self, socket_addr: SocketAddr) -> Identifier { let random_id = loop { // TODO: random should avoid 0xFFFF---- let id = Identifier::random(); trace!("checking if id is taken: {}", id); if !self.devices.contains_key(&id) { break id; } }; self.devices.insert(random_id, Device { device_id: random_id, socket_addr, properties: HashMap::new() }); info!("Registered new device: {}", random_id); random_id } pub fn add_device(&mut self, socket_addr: SocketAddr, identifier: Identifier) -> Identifier { self.devices.insert(identifier, Device { device_id: identifier, socket_addr, properties: HashMap::new() }); identifier } pub fn add_device_auto(&mut self, socket_addr: SocketAddr, identifier: Option) -> Identifier { let identifier = if identifier == Some(Identifier::default()) { None } else { identifier }; if let Some(identifier) = identifier { match (identifier, self.devices.contains_key(&identifier)) { (identifier, false) => self.add_device(socket_addr, identifier), _ => self.add_device_random(socket_addr) } } else { self.add_device_random(socket_addr) } } pub fn get_device(&self, identifier: Identifier) -> Option<&Device> { self.devices.get(&identifier) } }