Skip to main content

zerodds_dcps_async/
factory.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2026 ZeroDDS Contributors
3//! AsyncDomainParticipantFactory — Singleton-Wrapper.
4
5use zerodds_dcps::{DomainParticipantFactory, DomainParticipantQos, Result};
6
7use crate::AsyncDomainParticipant;
8
9/// Async-Wrapper um den Sync-Singleton. `instance()` liefert immer den
10/// gleichen Singleton; create_participant-Methoden teilen den State
11/// mit der sync-API.
12pub struct AsyncDomainParticipantFactory {
13    inner: &'static DomainParticipantFactory,
14}
15
16impl AsyncDomainParticipantFactory {
17    /// Singleton-Zugriff.
18    #[must_use]
19    pub fn instance() -> Self {
20        Self {
21            inner: DomainParticipantFactory::instance(),
22        }
23    }
24
25    /// Offline-Participant (kein UDP-Bind). Spec §1.1.
26    #[must_use]
27    pub fn create_participant_offline(&self, domain_id: i32) -> AsyncDomainParticipant {
28        let p = self
29            .inner
30            .create_participant_offline(domain_id, DomainParticipantQos::default());
31        AsyncDomainParticipant::from_sync(p)
32    }
33
34    /// Live-Participant (UDP + SPDP/SEDP).
35    ///
36    /// # Errors
37    /// Wie `DomainParticipantFactory::create_participant`.
38    pub fn create_participant(&self, domain_id: i32) -> Result<AsyncDomainParticipant> {
39        let p = self
40            .inner
41            .create_participant(domain_id, DomainParticipantQos::default())?;
42        Ok(AsyncDomainParticipant::from_sync(p))
43    }
44
45    /// Like `create_participant` aber mit eigener QoS.
46    ///
47    /// # Errors
48    /// Wie `DomainParticipantFactory::create_participant`.
49    pub fn create_participant_with_qos(
50        &self,
51        domain_id: i32,
52        qos: DomainParticipantQos,
53    ) -> Result<AsyncDomainParticipant> {
54        let p = self.inner.create_participant(domain_id, qos)?;
55        Ok(AsyncDomainParticipant::from_sync(p))
56    }
57}
58
59impl Default for AsyncDomainParticipantFactory {
60    fn default() -> Self {
61        Self::instance()
62    }
63}