use crate::{DdsListener, DdsParticipant, DdsQos, DdsWritable};
pub use cyclonedds_sys::{DDSError, DdsDomainId, DdsEntity};
use std::convert::From;
pub struct PublisherBuilder {
maybe_qos: Option<DdsQos>,
maybe_listener: Option<DdsListener>,
}
impl PublisherBuilder {
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<DdsPublisher, DDSError> {
DdsPublisher::create(participant, self.maybe_qos, self.maybe_listener)
}
}
#[derive(Clone)]
pub struct DdsPublisher(DdsEntity, Option<DdsListener>);
impl<'a> DdsPublisher {
pub fn create(
participant: &DdsParticipant,
maybe_qos: Option<DdsQos>,
maybe_listener: Option<DdsListener>,
) -> Result<Self, DDSError> {
unsafe {
let p = cyclonedds_sys::dds_create_publisher(
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(DdsPublisher(DdsEntity::new(p), maybe_listener))
} else {
Err(DDSError::from(p))
}
}
}
}
impl<'a> DdsWritable for DdsPublisher {
fn entity(&self) -> &DdsEntity {
&self.0
}
}