use super::field_value::FieldDataType;
use std::collections::HashMap;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct EnterpriseFieldDef {
pub enterprise_number: u32,
pub field_number: u16,
pub name: String,
pub data_type: FieldDataType,
}
impl EnterpriseFieldDef {
pub fn new(
enterprise_number: u32,
field_number: u16,
name: impl Into<String>,
data_type: FieldDataType,
) -> Self {
Self {
enterprise_number,
field_number,
name: name.into(),
data_type,
}
}
}
#[derive(Debug, Clone, Default)]
pub struct EnterpriseFieldRegistry {
fields: HashMap<(u32, u16), EnterpriseFieldDef>,
max_capacity: Option<usize>,
}
impl EnterpriseFieldRegistry {
pub fn new() -> Self {
Self {
fields: HashMap::new(),
max_capacity: None,
}
}
pub fn with_max_capacity(max: usize) -> Self {
assert!(max > 0, "EnterpriseFieldRegistry max_capacity must be > 0");
Self {
fields: HashMap::new(),
max_capacity: Some(max),
}
}
pub fn register(&mut self, def: EnterpriseFieldDef) -> bool {
let key = (def.enterprise_number, def.field_number);
if !self.fields.contains_key(&key)
&& let Some(max) = self.max_capacity
&& self.fields.len() >= max
{
return false;
}
self.fields.insert(key, def);
true
}
pub fn register_many(
&mut self,
defs: impl IntoIterator<Item = EnterpriseFieldDef>,
) -> usize {
let mut count = 0;
for def in defs {
if self.register(def) {
count += 1;
}
}
count
}
pub fn get(
&self,
enterprise_number: u32,
field_number: u16,
) -> Option<&EnterpriseFieldDef> {
self.fields.get(&(enterprise_number, field_number))
}
pub fn contains(&self, enterprise_number: u32, field_number: u16) -> bool {
self.fields.contains_key(&(enterprise_number, field_number))
}
pub fn len(&self) -> usize {
self.fields.len()
}
pub fn is_empty(&self) -> bool {
self.fields.is_empty()
}
pub fn clear(&mut self) {
self.fields.clear();
}
}