use crate::registry::{DataType, DataTypeSemantics};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ElementSource {
Registered,
TypeRecord,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct EnterpriseElement {
pub enterprise_number: u32,
pub id: u16,
pub name: Option<String>,
pub data_type: DataType,
pub semantics: Option<DataTypeSemantics>,
pub units: Option<u16>,
pub range_begin: Option<u64>,
pub range_end: Option<u64>,
pub description: Option<String>,
pub source: ElementSource,
}
impl EnterpriseElement {
pub fn new(enterprise_number: u32, id: u16, name: &str, data_type: DataType) -> Self {
Self {
enterprise_number,
id,
name: Some(name.to_string()),
data_type,
semantics: None,
units: None,
range_begin: None,
range_end: None,
description: None,
source: ElementSource::Registered,
}
}
pub fn with_semantics(mut self, semantics: DataTypeSemantics) -> Self {
self.semantics = Some(semantics);
self
}
pub fn has_valid_semantics(&self) -> bool {
let Some(semantics) = self.semantics else {
return true;
};
use DataType::*;
use DataTypeSemantics as S;
match self.data_type {
Unsigned8 | Unsigned16 | Unsigned32 | Unsigned64 | Unsigned256 => true,
Signed8 | Signed16 | Signed32 | Signed64 => semantics != S::Flags,
Float32 | Float64 => !matches!(semantics, S::Identifier | S::Flags),
BasicList | SubTemplateList | SubTemplateMultiList => {
matches!(semantics, S::Default | S::List)
}
_ => semantics == S::Default,
}
}
}