use crate::types::{Handle, Vector3};
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum XDataValue {
String(String),
ControlString(String),
LayerName(String),
BinaryData(Vec<u8>),
Handle(Handle),
Point3D(Vector3),
Position3D(Vector3),
Displacement3D(Vector3),
Direction3D(Vector3),
Real(f64),
Distance(f64),
ScaleFactor(f64),
Integer16(i16),
Integer32(i32),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ExtendedDataRecord {
pub application_name: String,
pub values: Vec<XDataValue>,
}
impl ExtendedDataRecord {
pub fn new(application_name: impl Into<String>) -> Self {
Self {
application_name: application_name.into(),
values: Vec::new(),
}
}
pub fn add_value(&mut self, value: XDataValue) {
self.values.push(value);
}
pub fn len(&self) -> usize {
self.values.len()
}
pub fn is_empty(&self) -> bool {
self.values.is_empty()
}
}
#[derive(Debug, Clone, Default, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ExtendedData {
records: Vec<ExtendedDataRecord>,
#[cfg_attr(feature = "serde", serde(skip))]
pub raw_dwg_eed: Vec<(u64, Vec<u8>)>,
}
impl ExtendedData {
pub fn new() -> Self {
Self {
records: Vec::new(),
raw_dwg_eed: Vec::new(),
}
}
pub fn add_record(&mut self, record: ExtendedDataRecord) {
self.records.push(record);
}
pub fn records(&self) -> &[ExtendedDataRecord] {
&self.records
}
pub fn get_record(&self, application_name: &str) -> Option<&ExtendedDataRecord> {
self.records
.iter()
.find(|r| r.application_name == application_name)
}
pub fn len(&self) -> usize {
self.records.len()
}
pub fn is_empty(&self) -> bool {
self.records.is_empty()
}
pub fn clear(&mut self) {
self.records.clear();
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_xdata_record_creation() {
let mut record = ExtendedDataRecord::new("MYAPP");
assert_eq!(record.application_name, "MYAPP");
assert!(record.is_empty());
record.add_value(XDataValue::String("test".to_string()));
assert_eq!(record.len(), 1);
}
#[test]
fn test_xdata_collection() {
let mut xdata = ExtendedData::new();
assert!(xdata.is_empty());
let mut record = ExtendedDataRecord::new("APP1");
record.add_value(XDataValue::Real(3.14));
xdata.add_record(record);
assert_eq!(xdata.len(), 1);
assert!(xdata.get_record("APP1").is_some());
assert!(xdata.get_record("APP2").is_none());
}
}