use crate::{
MAX_MESSAGES, ValueDescriptions,
compat::{BTreeMap, Name},
};
const MAX_VALUE_DESCRIPTION_ENTRIES: usize = MAX_MESSAGES;
type Key = (Option<u32>, Name);
type Map = BTreeMap<Key, ValueDescriptions, { MAX_VALUE_DESCRIPTION_ENTRIES }>;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ValueDescriptionsMap {
value_descriptions: Map,
}
impl Default for ValueDescriptionsMap {
fn default() -> Self {
Self {
value_descriptions: Map::new(),
}
}
}
impl ValueDescriptionsMap {
pub(crate) fn new(value_descriptions: Map) -> Self {
Self { value_descriptions }
}
#[inline]
#[must_use = "iterator is lazy and does nothing unless consumed"]
pub fn iter(&self) -> impl Iterator<Item = ((Option<u32>, &str), &ValueDescriptions)> + '_ {
self.value_descriptions
.iter()
.map(|((msg_id, name), vd)| ((*msg_id, name.as_str()), vd))
}
#[inline]
#[must_use = "return value should be used"]
pub fn len(&self) -> usize {
self.value_descriptions.len()
}
#[inline]
#[must_use = "return value should be used"]
pub fn is_empty(&self) -> bool {
self.value_descriptions.is_empty()
}
#[inline]
#[must_use = "return value should be used"]
pub fn for_signal(&self, message_id: u32, signal_name: &str) -> Option<&ValueDescriptions> {
self.value_descriptions
.iter()
.find(|((id, name), _)| {
name.as_str() == signal_name
&& match id {
Some(specific_id) => *specific_id == message_id,
None => false, }
})
.map(|(_, v)| v)
.or_else(|| {
self.value_descriptions
.iter()
.find(|((id, name), _)| id.is_none() && name.as_str() == signal_name)
.map(|(_, v)| v)
})
}
}