use bacnet_types::enums::ObjectType;
use bacnet_types::primitives::ObjectIdentifier;
use super::ObjectDatabase;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct LocalDevice(Option<ObjectIdentifier>);
impl LocalDevice {
pub fn identifier(self) -> Option<ObjectIdentifier> {
self.0
}
pub fn is_local(self, device: Option<ObjectIdentifier>) -> bool {
device.is_none_or(|device| Some(device) == self.0)
}
}
impl ObjectDatabase {
pub fn selected_device(&self) -> Option<ObjectIdentifier> {
select_device(
self.type_index
.get(&ObjectType::DEVICE)
.into_iter()
.flatten()
.copied(),
)
}
pub fn local_device(&self) -> LocalDevice {
LocalDevice(
self.selected_device()
.filter(|device| device.instance_number() != ObjectIdentifier::WILDCARD_INSTANCE),
)
}
}
fn select_device(
candidates: impl IntoIterator<Item = ObjectIdentifier>,
) -> Option<ObjectIdentifier> {
candidates
.into_iter()
.filter(|candidate| candidate.object_type() == ObjectType::DEVICE)
.min_by_key(|candidate| candidate.instance_number())
}
#[cfg(test)]
#[path = "local_device_tests.rs"]
mod tests;