#[allow(unused_imports)]
use super::*;
use crate::attribute::{AttributeTarget, AttributeValue};
#[derive(Debug, Clone, PartialEq, Default)]
pub struct AttributeValuesMap {
values: ValuesMap,
}
impl AttributeValuesMap {
#[allow(dead_code)]
pub(crate) fn new() -> Self {
Self {
values: ValuesMap::new(),
}
}
pub(crate) fn from_map(values: ValuesMap) -> Self {
Self { values }
}
#[inline]
#[must_use = "iterator is lazy and does nothing unless consumed"]
pub fn iter(&self) -> impl Iterator<Item = ((&str, &AttributeTarget), &AttributeValue)> {
self.values
.iter()
.map(|((name, target), value)| ((name.as_str(), target), value))
}
#[inline]
#[must_use = "return value should be used"]
pub fn len(&self) -> usize {
self.values.len()
}
#[inline]
#[must_use = "return value should be used"]
pub fn is_empty(&self) -> bool {
self.values.is_empty()
}
#[inline]
#[must_use = "return value should be used"]
pub fn get(&self, name: &str, target: &AttributeTarget) -> Option<&AttributeValue> {
self.values
.iter()
.find(|((n, t), _)| n.as_str() == name && t == target)
.map(|(_, v)| v)
}
#[inline]
#[must_use = "return value should be used"]
pub fn get_network(&self, name: &str) -> Option<&AttributeValue> {
self.get(name, &AttributeTarget::Network)
}
#[inline]
#[must_use = "return value should be used"]
pub fn get_node(&self, node_name: &str, attr_name: &str) -> Option<&AttributeValue> {
self.values
.iter()
.find(|((n, t), _)| {
n.as_str() == attr_name
&& matches!(t, AttributeTarget::Node(name) if name.as_str() == node_name)
})
.map(|(_, v)| v)
}
#[inline]
#[must_use = "return value should be used"]
pub fn get_message(&self, message_id: u32, attr_name: &str) -> Option<&AttributeValue> {
self.values
.iter()
.find(|((n, t), _)| {
n.as_str() == attr_name
&& matches!(t, AttributeTarget::Message(id) if *id == message_id)
})
.map(|(_, v)| v)
}
#[inline]
#[must_use = "return value should be used"]
pub fn get_signal(
&self,
message_id: u32,
signal_name: &str,
attr_name: &str,
) -> Option<&AttributeValue> {
self.values
.iter()
.find(|((n, t), _)| {
n.as_str() == attr_name
&& matches!(t, AttributeTarget::Signal(msg_id, sig_name)
if *msg_id == message_id && sig_name.as_str() == signal_name)
})
.map(|(_, v)| v)
}
}