use crate::Duration;
use crate::internal::traits::AsFfi;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct UserData {
pub value: Vec<u8>,
}
impl AsFfi for UserData {
type Target<'a> = &'a [u8];
fn as_ffi(&self) -> Self::Target<'_> {
&self.value
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct TopicData {
pub value: Vec<u8>,
}
impl AsFfi for TopicData {
type Target<'a> = &'a [u8];
#[inline]
fn as_ffi(&self) -> Self::Target<'_> {
&self.value
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct GroupData {
pub value: Vec<u8>,
}
impl AsFfi for GroupData {
type Target<'a> = &'a [u8];
#[inline]
fn as_ffi(&self) -> Self::Target<'_> {
&self.value
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Durability {
Volatile,
TransientLocal,
Transient,
Persistent,
}
impl AsFfi for Durability {
type Target<'a> = cyclonedds_sys::dds_durability_kind_t;
#[inline]
fn as_ffi(&self) -> Self::Target<'_> {
match self {
Durability::Volatile => cyclonedds_sys::dds_durability_kind_DDS_DURABILITY_VOLATILE,
Durability::TransientLocal => {
cyclonedds_sys::dds_durability_kind_DDS_DURABILITY_TRANSIENT_LOCAL
}
Durability::Transient => cyclonedds_sys::dds_durability_kind_DDS_DURABILITY_TRANSIENT,
Durability::Persistent => cyclonedds_sys::dds_durability_kind_DDS_DURABILITY_PERSISTENT,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct DurabilityService {
pub service_cleanup_delay: Duration,
pub history: History,
pub resource_limits: ResourceLimits,
}
impl AsFfi for DurabilityService {
type Target<'a> = (
cyclonedds_sys::dds_duration_t,
cyclonedds_sys::dds_history_kind_t,
i32,
i32,
i32,
i32,
);
#[inline]
fn as_ffi(&self) -> Self::Target<'_> {
let (history_kind, history_depth) = self.history.as_ffi();
let service_cleanup_delay = self.service_cleanup_delay.inner;
(
service_cleanup_delay,
history_kind,
history_depth,
self.resource_limits.max_samples.as_ffi(),
self.resource_limits.max_instances.as_ffi(),
self.resource_limits.max_samples_per_instance.as_ffi(),
)
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Presentation {
Instance {
coherent_access: bool,
ordered_access: bool,
},
Topic {
coherent_access: bool,
ordered_access: bool,
},
Group {
coherent_access: bool,
ordered_access: bool,
},
}
impl AsFfi for Presentation {
type Target<'a> = (
cyclonedds_sys::dds_presentation_access_scope_kind,
bool,
bool,
);
#[inline]
fn as_ffi(&self) -> Self::Target<'_> {
match self {
Presentation::Instance {
coherent_access,
ordered_access,
} => (
cyclonedds_sys::dds_presentation_access_scope_kind_DDS_PRESENTATION_INSTANCE,
*coherent_access,
*ordered_access,
),
Presentation::Topic {
coherent_access,
ordered_access,
} => (
cyclonedds_sys::dds_presentation_access_scope_kind_DDS_PRESENTATION_TOPIC,
*coherent_access,
*ordered_access,
),
Presentation::Group {
coherent_access,
ordered_access,
} => (
cyclonedds_sys::dds_presentation_access_scope_kind_DDS_PRESENTATION_GROUP,
*coherent_access,
*ordered_access,
),
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct Deadline {
pub period: Duration,
}
impl AsFfi for Deadline {
type Target<'a> = cyclonedds_sys::dds_duration_t;
#[inline]
fn as_ffi(&self) -> Self::Target<'_> {
self.period.inner
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct LatencyBudget {
pub duration: Duration,
}
impl AsFfi for LatencyBudget {
type Target<'a> = cyclonedds_sys::dds_duration_t;
#[inline]
fn as_ffi(&self) -> Self::Target<'_> {
self.duration.inner
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Ownership {
Shared,
Exclusive {
strength: i32,
},
}
impl AsFfi for Ownership {
type Target<'a> = (cyclonedds_sys::dds_ownership_kind_t, Option<i32>);
#[inline]
fn as_ffi(&self) -> Self::Target<'_> {
match self {
Ownership::Shared => (
cyclonedds_sys::dds_ownership_kind_DDS_OWNERSHIP_SHARED,
None,
),
Ownership::Exclusive { strength } => (
cyclonedds_sys::dds_ownership_kind_DDS_OWNERSHIP_EXCLUSIVE,
Some(*strength),
),
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Liveliness {
Automatic {
lease_duration: Duration,
},
ManualByParticipant {
lease_duration: Duration,
},
ManualByTopic {
lease_duration: Duration,
},
}
impl AsFfi for Liveliness {
type Target<'a> = (
cyclonedds_sys::dds_liveliness_kind_t,
cyclonedds_sys::dds_duration_t,
);
#[inline]
fn as_ffi(&self) -> Self::Target<'_> {
match self {
Liveliness::Automatic { lease_duration } => (
cyclonedds_sys::dds_liveliness_kind_DDS_LIVELINESS_AUTOMATIC,
lease_duration.inner,
),
Liveliness::ManualByParticipant { lease_duration } => (
cyclonedds_sys::dds_liveliness_kind_DDS_LIVELINESS_MANUAL_BY_PARTICIPANT,
lease_duration.inner,
),
Liveliness::ManualByTopic { lease_duration } => (
cyclonedds_sys::dds_liveliness_kind_DDS_LIVELINESS_MANUAL_BY_TOPIC,
lease_duration.inner,
),
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct TimeBasedFilter {
pub minimum_separation: Duration,
}
impl AsFfi for TimeBasedFilter {
type Target<'a> = cyclonedds_sys::dds_duration_t;
#[inline]
fn as_ffi(&self) -> Self::Target<'_> {
self.minimum_separation.inner
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Partition {
pub partitions: Vec<String>,
}
impl AsFfi for Partition {
type Target<'a> = Vec<std::ffi::CString>;
#[inline]
fn as_ffi(&self) -> Self::Target<'_> {
self.partitions
.iter()
.map(|partition| {
std::ffi::CString::new(partition.as_str()).expect(
"TODO should this be moved to the construction of the partition policy?",
)
})
.collect()
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Reliability {
BestEffort,
Reliable {
max_blocking_time: Duration,
},
}
impl AsFfi for Reliability {
type Target<'a> = (
cyclonedds_sys::dds_reliability_kind_t,
cyclonedds_sys::dds_duration_t,
);
#[inline]
fn as_ffi(&self) -> Self::Target<'_> {
match self {
Reliability::BestEffort => (
cyclonedds_sys::dds_reliability_kind_DDS_RELIABILITY_BEST_EFFORT,
0,
),
Reliability::Reliable { max_blocking_time } => (
cyclonedds_sys::dds_reliability_kind_DDS_RELIABILITY_RELIABLE,
max_blocking_time.inner,
),
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct TransportPriority {
pub priority: i32,
}
impl AsFfi for TransportPriority {
type Target<'a> = i32;
#[inline]
fn as_ffi(&self) -> Self::Target<'_> {
self.priority
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct Lifespan {
pub duration: Duration,
}
impl AsFfi for Lifespan {
type Target<'a> = cyclonedds_sys::dds_duration_t;
#[inline]
fn as_ffi(&self) -> Self::Target<'_> {
self.duration.inner
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum DestinationOrder {
ByReceptionTimestamp,
BySourceTimestamp,
}
impl AsFfi for DestinationOrder {
type Target<'a> = cyclonedds_sys::dds_destination_order_kind_t;
#[inline]
fn as_ffi(&self) -> Self::Target<'_> {
match self {
DestinationOrder::ByReceptionTimestamp =>
cyclonedds_sys::dds_destination_order_kind_DDS_DESTINATIONORDER_BY_RECEPTION_TIMESTAMP,
DestinationOrder::BySourceTimestamp =>
cyclonedds_sys::dds_destination_order_kind_DDS_DESTINATIONORDER_BY_SOURCE_TIMESTAMP,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum History {
KeepAll,
KeepLast {
depth: i32,
},
}
impl AsFfi for History {
type Target<'a> = (cyclonedds_sys::dds_history_kind_t, i32);
#[inline]
fn as_ffi(&self) -> Self::Target<'_> {
match self {
History::KeepAll => (cyclonedds_sys::dds_history_kind_DDS_HISTORY_KEEP_ALL, 0),
History::KeepLast { depth } => (
cyclonedds_sys::dds_history_kind_DDS_HISTORY_KEEP_LAST,
*depth,
),
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct ResourceLimits {
pub max_samples: ResourceLimit,
pub max_instances: ResourceLimit,
pub max_samples_per_instance: ResourceLimit,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum ResourceLimit {
Unlimited,
Limited(u32),
}
impl ResourceLimit {
#[must_use]
fn as_ffi(self) -> i32 {
const INVALID_LIMIT_IN_CYCLONE_C_LIB: i32 = 0;
match self {
ResourceLimit::Unlimited => cyclonedds_sys::DDS_LENGTH_UNLIMITED,
ResourceLimit::Limited(limit) => {
i32::try_from(limit).unwrap_or(INVALID_LIMIT_IN_CYCLONE_C_LIB)
}
}
}
}
impl AsFfi for ResourceLimits {
type Target<'a> = (i32, i32, i32);
#[inline]
fn as_ffi(&self) -> Self::Target<'_> {
(
self.max_samples.as_ffi(),
self.max_instances.as_ffi(),
self.max_samples_per_instance.as_ffi(),
)
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct EntityFactory {
pub autoenable_created_entities: bool,
}
impl AsFfi for EntityFactory {
type Target<'a> = bool;
#[inline]
fn as_ffi(&self) -> Self::Target<'_> {
self.autoenable_created_entities
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct WriterDataLifecycle {
pub autodispose_unregistered_instances: bool,
}
impl AsFfi for WriterDataLifecycle {
type Target<'a> = bool;
#[inline]
fn as_ffi(&self) -> Self::Target<'_> {
self.autodispose_unregistered_instances
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct ReaderDataLifecycle {
pub autopurge_nowriter_samples_delay: Duration,
pub autopurge_disposed_samples_delay: Duration,
}
impl AsFfi for ReaderDataLifecycle {
type Target<'a> = (
cyclonedds_sys::dds_duration_t,
cyclonedds_sys::dds_duration_t,
);
#[inline]
fn as_ffi(&self) -> Self::Target<'_> {
(
self.autopurge_nowriter_samples_delay.inner,
self.autopurge_disposed_samples_delay.inner,
)
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct EntityName {
pub name: String,
}
impl AsFfi for EntityName {
type Target<'a> = std::ffi::CString;
#[inline]
fn as_ffi(&self) -> Self::Target<'_> {
std::ffi::CString::new(self.name.as_str())
.expect("unable to safely create std::ffi::CString from entity name")
}
}