use std::{
time::{Duration},
};
use serde::Serialize;
use crate::{
serialization::CDRSerializerAdapter,
structure::time::Timestamp,
};
use crate::structure::entity::{RTPSEntity};
use crate::dds::pubsub::Publisher;
use crate::dds::topic::Topic;
use crate::dds::values::result::Result;
use crate::dds::data_types::*;
use crate::dds::traits::dds_entity::DDSEntity;
use crate::dds::traits::serde_adapters::SerializerAdapter;
use crate::dds::qos::{HasQoSPolicy, QosPolicies};
use crate::{
discovery::data_types::topic_data::SubscriptionBuiltinTopicData,
dds::with_key::datawriter as datawriter_with_key,
};
use super::wrappers::{NoKeyWrapper, SAWrapper};
pub struct DataWriter<D: Serialize, SA: SerializerAdapter<D> = CDRSerializerAdapter<D>> {
keyed_datawriter: datawriter_with_key::DataWriter<NoKeyWrapper<D>, SAWrapper<SA>>,
}
impl<D, SA> DataWriter<D, SA>
where
D: Serialize,
SA: SerializerAdapter<D>,
{
pub(crate) fn from_keyed(
keyed: datawriter_with_key::DataWriter<NoKeyWrapper<D>, SAWrapper<SA>>,
) -> DataWriter<D, SA> {
DataWriter {
keyed_datawriter: keyed,
}
}
pub fn write(&self, data: D, source_timestamp: Option<Timestamp>) -> Result<()> {
self
.keyed_datawriter
.write(NoKeyWrapper::<D> { d: data }, source_timestamp)
}
pub fn wait_for_acknowledgments(&self, max_wait: Duration) -> Result<()> {
self.keyed_datawriter.wait_for_acknowledgments(max_wait)
}
pub fn get_topic(&self) -> &Topic {
&self.keyed_datawriter.get_topic()
}
pub fn get_publisher(&self) -> &Publisher {
&self.keyed_datawriter.get_publisher()
}
pub fn assert_liveliness(&self) -> Result<()> {
self.keyed_datawriter.assert_liveliness()
}
pub fn get_matched_subscriptions(&self) -> Vec<SubscriptionBuiltinTopicData> {
self.keyed_datawriter.get_matched_subscriptions()
}
}
impl<D: Serialize, SA: SerializerAdapter<D>> RTPSEntity for DataWriter<D, SA> {
fn get_guid(&self) -> GUID {
self.keyed_datawriter.get_guid()
}
}
impl<D: Serialize, SA: SerializerAdapter<D>> HasQoSPolicy for DataWriter<D, SA> {
fn get_qos(&self) -> QosPolicies {
self.keyed_datawriter.get_qos()
}
}
impl<D: Serialize, SA: SerializerAdapter<D>> DDSEntity for DataWriter<D, SA> {}
#[cfg(test)]
mod tests {
use super::*;
use crate::dds::{participant::DomainParticipant, topic::TopicKind};
use crate::test::random_data::*;
use crate::serialization::cdr_serializer::*;
use byteorder::LittleEndian;
#[test]
fn dw_write_test() {
let domain_participant = DomainParticipant::new(0);
let qos = QosPolicies::qos_none();
let _default_dw_qos = QosPolicies::qos_none();
let publisher = domain_participant
.create_publisher(&qos)
.expect("Failed to create publisher");
let topic = domain_participant
.create_topic("Aasii", "Huh?", &qos, TopicKind::NoKey)
.expect("Failed to create topic");
let data_writer: DataWriter<RandomData, CDRSerializerAdapter<RandomData, LittleEndian>> =
publisher
.create_datawriter_no_key(None, topic, None)
.expect("Failed to create datawriter");
let mut data = RandomData {
a: 4,
b: "Fobar".to_string(),
};
data_writer
.write(data.clone(), None)
.expect("Unable to write data");
data.a = 5;
let timestamp: Timestamp = Timestamp::now();
data_writer
.write(data, Some(timestamp))
.expect("Unable to write data with timestamp");
}
#[test]
fn dw_wait_for_ack_test() {
let domain_participant = DomainParticipant::new(0);
let qos = QosPolicies::qos_none();
let publisher = domain_participant
.create_publisher(&qos)
.expect("Failed to create publisher");
let topic = domain_participant
.create_topic("Aasii", "Huh?", &qos, TopicKind::NoKey)
.expect("Failed to create topic");
let data_writer: DataWriter<RandomData, CDRSerializerAdapter<RandomData, LittleEndian>> =
publisher
.create_datawriter_no_key(None, topic, None)
.expect("Failed to create datawriter");
let data = RandomData {
a: 4,
b: "Fobar".to_string(),
};
data_writer.write(data, None).expect("Unable to write data");
let res = data_writer
.wait_for_acknowledgments(Duration::from_secs(5))
.unwrap();
assert_eq!(res, ());
}
}