Skip to main content

zerodds_types/dynamic/
factory.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2026 ZeroDDS Contributors
3//! DynamicDataFactory (XTypes 1.3 §7.5.7).
4
5use super::data::DynamicData;
6use super::error::DynamicError;
7use super::type_::DynamicType;
8
9/// XTypes 1.3 §7.5.7 DynamicDataFactory.
10///
11/// Stateless. `delete_data` ist ein No-Op (Rust-RAII
12/// uebernimmt das Cleanup), wird aber als Spec-API exponiert fuer
13/// API-Treue.
14pub struct DynamicDataFactory;
15
16impl DynamicDataFactory {
17    /// Spec §7.5.7.1.1 `create_data(type)`.
18    ///
19    /// # Errors
20    /// `Inconsistent` wenn der Type nicht konsistent ist.
21    pub fn create_data(type_: &DynamicType) -> Result<DynamicData, DynamicError> {
22        type_.is_consistent()?;
23        Ok(DynamicData::new(type_.clone()))
24    }
25
26    /// Spec §7.5.7.1.2 `delete_data(data)` — RAII-No-Op.
27    pub fn delete_data(_data: DynamicData) {
28        // Drop-Impl macht den Rest.
29    }
30}
31
32#[cfg(test)]
33#[allow(clippy::unwrap_used)]
34mod tests {
35    use super::*;
36    use crate::dynamic::DynamicTypeBuilderFactory;
37    use crate::dynamic::descriptor::{TypeDescriptor, TypeKind};
38
39    #[test]
40    fn factory_create_data_returns_empty_instance() {
41        let mut b = DynamicTypeBuilderFactory::create_struct("::S");
42        b.add_struct_member("x", 1, TypeDescriptor::primitive(TypeKind::Int32, "int32"))
43            .unwrap();
44        let t = b.build().unwrap();
45        let d = DynamicDataFactory::create_data(&t).unwrap();
46        assert_eq!(d.item_count(), 0);
47        assert_eq!(d.dynamic_type().name(), "::S");
48    }
49
50    #[test]
51    fn factory_delete_data_is_noop() {
52        let t = DynamicTypeBuilderFactory::get_primitive_type(TypeKind::Int32).unwrap();
53        let d = DynamicDataFactory::create_data(&t).unwrap();
54        DynamicDataFactory::delete_data(d);
55    }
56}