1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
use crate::{DdsListener, DdsParticipant, DdsQos, DdsReadable};
pub use cyclonedds_sys::{DDSError, DdsDomainId, DdsEntity};
use std::{convert::From};
pub struct SubscriberBuilder {
maybe_qos: Option<DdsQos>,
maybe_listener: Option<DdsListener>,
}
impl SubscriberBuilder {
pub fn new() -> Self {
Self {
maybe_qos: None,
maybe_listener: None,
}
}
pub fn with_qos(mut self, qos : DdsQos) -> Self {
self.maybe_qos = Some(qos);
self
}
pub fn with_listener(mut self, listener : DdsListener) -> Self {
self.maybe_listener = Some(listener);
self
}
pub fn create(self,participant: &DdsParticipant) -> Result<DdsSubscriber, DDSError> {
DdsSubscriber::create(participant, self.maybe_qos, self.maybe_listener)
}
}
#[derive(Clone)]
pub struct DdsSubscriber(DdsEntity, Option<DdsListener>);
impl<'a> DdsSubscriber {
pub fn create(
participant: &DdsParticipant,
maybe_qos: Option<DdsQos>,
maybe_listener: Option<DdsListener>,
) -> Result<Self, DDSError> {
unsafe {
let p = cyclonedds_sys::dds_create_subscriber(
participant.entity().entity(),
maybe_qos.map_or(std::ptr::null(), |d| d.into()),
maybe_listener.as_ref().map_or(std::ptr::null(), |l| l.into()),
);
if p > 0 {
Ok(DdsSubscriber(DdsEntity::new(p),maybe_listener))
} else {
Err(DDSError::from(p))
}
}
}
}
impl<'a> DdsReadable for DdsSubscriber {
fn entity(&self) -> &DdsEntity {
&self.0
}
}