use crate::{
QoSDurabilityPolicy, QoSDuration, QoSHistoryPolicy, QoSLivelinessPolicy, QoSProfile,
QoSReliabilityPolicy,
};
use std::{borrow::Borrow, time::Duration};
#[derive(Debug, Clone, Copy)]
#[non_exhaustive]
pub struct PrimitiveOptions<'a> {
pub name: &'a str,
pub history: Option<QoSHistoryPolicy>,
pub reliability: Option<QoSReliabilityPolicy>,
pub durability: Option<QoSDurabilityPolicy>,
pub deadline: Option<QoSDuration>,
pub lifespan: Option<QoSDuration>,
pub liveliness: Option<QoSLivelinessPolicy>,
pub liveliness_lease: Option<QoSDuration>,
pub avoid_ros_namespace_conventions: Option<bool>,
}
pub trait IntoPrimitiveOptions<'a>: Sized {
fn into_primitive_options(self) -> PrimitiveOptions<'a>;
fn qos(self, profile: QoSProfile) -> PrimitiveOptions<'a> {
let mut options = self
.into_primitive_options()
.history(profile.history)
.reliability(profile.reliability)
.durability(profile.durability)
.deadline(profile.deadline)
.lifespan(profile.lifespan)
.liveliness(profile.liveliness)
.liveliness_lease(profile.liveliness_lease);
if profile.avoid_ros_namespace_conventions {
options.avoid_ros_namespace_conventions = Some(true);
}
options
}
fn topics_qos(self) -> PrimitiveOptions<'a> {
self.qos(QoSProfile::topics_default())
}
fn sensor_data_qos(self) -> PrimitiveOptions<'a> {
self.qos(QoSProfile::sensor_data_default())
}
fn services_qos(self) -> PrimitiveOptions<'a> {
self.qos(QoSProfile::services_default())
}
fn system_qos(self) -> PrimitiveOptions<'a> {
self.qos(QoSProfile::system_default())
}
fn history(self, history: QoSHistoryPolicy) -> PrimitiveOptions<'a> {
let mut options = self.into_primitive_options();
options.history = Some(history);
options
}
fn keep_last(self, depth: u32) -> PrimitiveOptions<'a> {
self.history(QoSHistoryPolicy::KeepLast { depth })
}
fn keep_all(self) -> PrimitiveOptions<'a> {
self.history(QoSHistoryPolicy::KeepAll)
}
fn reliability(self, reliability: QoSReliabilityPolicy) -> PrimitiveOptions<'a> {
let mut options = self.into_primitive_options();
options.reliability = Some(reliability);
options
}
fn reliable(self) -> PrimitiveOptions<'a> {
self.reliability(QoSReliabilityPolicy::Reliable)
}
fn best_effort(self) -> PrimitiveOptions<'a> {
self.reliability(QoSReliabilityPolicy::BestEffort)
}
fn durability(self, durability: QoSDurabilityPolicy) -> PrimitiveOptions<'a> {
let mut options = self.into_primitive_options();
options.durability = Some(durability);
options
}
fn volatile(self) -> PrimitiveOptions<'a> {
self.durability(QoSDurabilityPolicy::Volatile)
}
fn transient_local(self) -> PrimitiveOptions<'a> {
self.durability(QoSDurabilityPolicy::TransientLocal)
}
fn lifespan(self, lifespan: QoSDuration) -> PrimitiveOptions<'a> {
let mut options = self.into_primitive_options();
options.lifespan = Some(lifespan);
options
}
fn lifespan_duration(self, duration: Duration) -> PrimitiveOptions<'a> {
self.lifespan(QoSDuration::Custom(duration))
}
fn infinite_lifespan(self) -> PrimitiveOptions<'a> {
self.lifespan(QoSDuration::Infinite)
}
fn deadline(self, deadline: QoSDuration) -> PrimitiveOptions<'a> {
let mut options = self.into_primitive_options();
options.deadline = Some(deadline);
options
}
fn deadline_duration(self, duration: Duration) -> PrimitiveOptions<'a> {
self.deadline(QoSDuration::Custom(duration))
}
fn no_deadline(self) -> PrimitiveOptions<'a> {
self.deadline(QoSDuration::Infinite)
}
fn liveliness(self, liveliness: QoSLivelinessPolicy) -> PrimitiveOptions<'a> {
let mut options = self.into_primitive_options();
options.liveliness = Some(liveliness);
options
}
fn liveliness_automatic(self) -> PrimitiveOptions<'a> {
self.liveliness(QoSLivelinessPolicy::Automatic)
}
fn liveliness_manual(self) -> PrimitiveOptions<'a> {
self.liveliness(QoSLivelinessPolicy::ManualByTopic)
}
fn liveliness_lease(self, lease: QoSDuration) -> PrimitiveOptions<'a> {
let mut options = self.into_primitive_options();
options.liveliness_lease = Some(lease);
options
}
fn liveliness_lease_duration(self, duration: Duration) -> PrimitiveOptions<'a> {
self.liveliness_lease(QoSDuration::Custom(duration))
}
fn avoid_ros_namespace_conventions(self) -> PrimitiveOptions<'a> {
let mut options = self.into_primitive_options();
options.avoid_ros_namespace_conventions = Some(true);
options
}
}
impl<'a> IntoPrimitiveOptions<'a> for PrimitiveOptions<'a> {
fn into_primitive_options(self) -> PrimitiveOptions<'a> {
self
}
}
impl<'a> IntoPrimitiveOptions<'a> for &'a str {
fn into_primitive_options(self) -> PrimitiveOptions<'a> {
PrimitiveOptions::new(self)
}
}
impl<'a, T: Borrow<str>> IntoPrimitiveOptions<'a> for &'a T {
fn into_primitive_options(self) -> PrimitiveOptions<'a> {
self.borrow().into_primitive_options()
}
}
impl<'a> PrimitiveOptions<'a> {
pub fn new(name: &'a str) -> Self {
Self {
name,
history: None,
reliability: None,
durability: None,
deadline: None,
lifespan: None,
liveliness: None,
liveliness_lease: None,
avoid_ros_namespace_conventions: None,
}
}
pub fn apply_to(&self, qos: &mut QoSProfile) {
if let Some(history) = self.history {
qos.history = history;
}
if let Some(reliability) = self.reliability {
qos.reliability = reliability;
}
if let Some(durability) = self.durability {
qos.durability = durability;
}
if let Some(deadline) = self.deadline {
qos.deadline = deadline;
}
if let Some(lifespan) = self.lifespan {
qos.lifespan = lifespan;
}
if let Some(liveliness) = self.liveliness {
qos.liveliness = liveliness;
}
if let Some(liveliness_lease) = self.liveliness_lease {
qos.liveliness_lease = liveliness_lease;
}
if let Some(convention) = self.avoid_ros_namespace_conventions {
qos.avoid_ros_namespace_conventions = convention;
}
}
}