use crate::{DdsEntity, DdsResult};
use cyclonedds_rust_sys::*;
pub const STATUS_INCONSISTENT_TOPIC: u32 = 1u32 << dds_status_id_DDS_INCONSISTENT_TOPIC_STATUS_ID;
pub const STATUS_OFFERED_DEADLINE_MISSED: u32 =
1u32 << dds_status_id_DDS_OFFERED_DEADLINE_MISSED_STATUS_ID;
pub const STATUS_REQUESTED_DEADLINE_MISSED: u32 =
1u32 << dds_status_id_DDS_REQUESTED_DEADLINE_MISSED_STATUS_ID;
pub const STATUS_OFFERED_INCOMPATIBLE_QOS: u32 =
1u32 << dds_status_id_DDS_OFFERED_INCOMPATIBLE_QOS_STATUS_ID;
pub const STATUS_REQUESTED_INCOMPATIBLE_QOS: u32 =
1u32 << dds_status_id_DDS_REQUESTED_INCOMPATIBLE_QOS_STATUS_ID;
pub const STATUS_SAMPLE_LOST: u32 = 1u32 << dds_status_id_DDS_SAMPLE_LOST_STATUS_ID;
pub const STATUS_SAMPLE_REJECTED: u32 = 1u32 << dds_status_id_DDS_SAMPLE_REJECTED_STATUS_ID;
pub const STATUS_DATA_ON_READERS: u32 = 1u32 << dds_status_id_DDS_DATA_ON_READERS_STATUS_ID;
pub const STATUS_DATA_AVAILABLE: u32 = 1u32 << dds_status_id_DDS_DATA_AVAILABLE_STATUS_ID;
pub const STATUS_LIVELINESS_LOST: u32 = 1u32 << dds_status_id_DDS_LIVELINESS_LOST_STATUS_ID;
pub const STATUS_LIVELINESS_CHANGED: u32 = 1u32 << dds_status_id_DDS_LIVELINESS_CHANGED_STATUS_ID;
pub const STATUS_PUBLICATION_MATCHED: u32 = 1u32 << dds_status_id_DDS_PUBLICATION_MATCHED_STATUS_ID;
pub const STATUS_SUBSCRIPTION_MATCHED: u32 =
1u32 << dds_status_id_DDS_SUBSCRIPTION_MATCHED_STATUS_ID;
pub const STATUS_ALL: u32 = STATUS_INCONSISTENT_TOPIC
| STATUS_OFFERED_DEADLINE_MISSED
| STATUS_REQUESTED_DEADLINE_MISSED
| STATUS_OFFERED_INCOMPATIBLE_QOS
| STATUS_REQUESTED_INCOMPATIBLE_QOS
| STATUS_SAMPLE_LOST
| STATUS_SAMPLE_REJECTED
| STATUS_DATA_ON_READERS
| STATUS_DATA_AVAILABLE
| STATUS_LIVELINESS_LOST
| STATUS_LIVELINESS_CHANGED
| STATUS_PUBLICATION_MATCHED
| STATUS_SUBSCRIPTION_MATCHED;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SampleRejectedReason {
NotRejected,
RejectedByInstancesLimit,
RejectedBySamplesLimit,
RejectedBySamplesPerInstanceLimit,
Unknown(u32),
}
impl From<dds_sample_rejected_status_kind> for SampleRejectedReason {
fn from(v: dds_sample_rejected_status_kind) -> Self {
match v {
x if x == dds_sample_rejected_status_kind_DDS_NOT_REJECTED => {
SampleRejectedReason::NotRejected
}
x if x == dds_sample_rejected_status_kind_DDS_REJECTED_BY_INSTANCES_LIMIT => {
SampleRejectedReason::RejectedByInstancesLimit
}
x if x == dds_sample_rejected_status_kind_DDS_REJECTED_BY_SAMPLES_LIMIT => {
SampleRejectedReason::RejectedBySamplesLimit
}
x if x
== dds_sample_rejected_status_kind_DDS_REJECTED_BY_SAMPLES_PER_INSTANCE_LIMIT =>
{
SampleRejectedReason::RejectedBySamplesPerInstanceLimit
}
other => SampleRejectedReason::Unknown(other),
}
}
}
#[derive(Debug, Clone)]
pub struct InconsistentTopicStatus {
pub total_count: u32,
pub total_count_change: i32,
}
#[derive(Debug, Clone)]
pub struct LivelinessLostStatus {
pub total_count: u32,
pub total_count_change: i32,
}
#[derive(Debug, Clone)]
pub struct LivelinessChangedStatus {
pub alive_count: u32,
pub not_alive_count: u32,
pub alive_count_change: i32,
pub not_alive_count_change: i32,
pub last_publication_handle: dds_instance_handle_t,
}
#[derive(Debug, Clone)]
pub struct OfferedDeadlineMissedStatus {
pub total_count: u32,
pub total_count_change: i32,
pub last_instance_handle: dds_instance_handle_t,
}
#[derive(Debug, Clone)]
pub struct OfferedIncompatibleQosStatus {
pub total_count: u32,
pub total_count_change: i32,
pub last_policy_id: u32,
}
#[derive(Debug, Clone)]
pub struct RequestedDeadlineMissedStatus {
pub total_count: u32,
pub total_count_change: i32,
pub last_instance_handle: dds_instance_handle_t,
}
#[derive(Debug, Clone)]
pub struct RequestedIncompatibleQosStatus {
pub total_count: u32,
pub total_count_change: i32,
pub last_policy_id: u32,
}
#[derive(Debug, Clone)]
pub struct SampleLostStatus {
pub total_count: u32,
pub total_count_change: i32,
}
#[derive(Debug, Clone)]
pub struct SampleRejectedStatus {
pub total_count: u32,
pub total_count_change: i32,
pub last_reason: SampleRejectedReason,
pub last_instance_handle: dds_instance_handle_t,
}
#[derive(Debug, Clone)]
pub struct PublicationMatchedStatus {
pub total_count: u32,
pub total_count_change: i32,
pub current_count: u32,
pub current_count_change: i32,
pub last_subscription_handle: dds_instance_handle_t,
}
#[derive(Debug, Clone)]
pub struct SubscriptionMatchedStatus {
pub total_count: u32,
pub total_count_change: i32,
pub current_count: u32,
pub current_count_change: i32,
pub last_publication_handle: dds_instance_handle_t,
}
#[derive(Debug, Clone, Default)]
pub struct EntityStatus {
pub inconsistent_topic: Option<InconsistentTopicStatus>,
pub liveliness_lost: Option<LivelinessLostStatus>,
pub liveliness_changed: Option<LivelinessChangedStatus>,
pub offered_deadline_missed: Option<OfferedDeadlineMissedStatus>,
pub offered_incompatible_qos: Option<OfferedIncompatibleQosStatus>,
pub requested_deadline_missed: Option<RequestedDeadlineMissedStatus>,
pub requested_incompatible_qos: Option<RequestedIncompatibleQosStatus>,
pub sample_lost: Option<SampleLostStatus>,
pub sample_rejected: Option<SampleRejectedStatus>,
pub publication_matched: Option<PublicationMatchedStatus>,
pub subscription_matched: Option<SubscriptionMatchedStatus>,
}
impl From<dds_inconsistent_topic_status> for InconsistentTopicStatus {
fn from(s: dds_inconsistent_topic_status) -> Self {
InconsistentTopicStatus {
total_count: s.total_count,
total_count_change: s.total_count_change,
}
}
}
impl From<dds_liveliness_lost_status> for LivelinessLostStatus {
fn from(s: dds_liveliness_lost_status) -> Self {
LivelinessLostStatus {
total_count: s.total_count,
total_count_change: s.total_count_change,
}
}
}
impl From<dds_liveliness_changed_status> for LivelinessChangedStatus {
fn from(s: dds_liveliness_changed_status) -> Self {
LivelinessChangedStatus {
alive_count: s.alive_count,
not_alive_count: s.not_alive_count,
alive_count_change: s.alive_count_change,
not_alive_count_change: s.not_alive_count_change,
last_publication_handle: s.last_publication_handle,
}
}
}
impl From<dds_offered_deadline_missed_status> for OfferedDeadlineMissedStatus {
fn from(s: dds_offered_deadline_missed_status) -> Self {
OfferedDeadlineMissedStatus {
total_count: s.total_count,
total_count_change: s.total_count_change,
last_instance_handle: s.last_instance_handle,
}
}
}
impl From<dds_offered_incompatible_qos_status> for OfferedIncompatibleQosStatus {
fn from(s: dds_offered_incompatible_qos_status) -> Self {
OfferedIncompatibleQosStatus {
total_count: s.total_count,
total_count_change: s.total_count_change,
last_policy_id: s.last_policy_id,
}
}
}
impl From<dds_requested_deadline_missed_status> for RequestedDeadlineMissedStatus {
fn from(s: dds_requested_deadline_missed_status) -> Self {
RequestedDeadlineMissedStatus {
total_count: s.total_count,
total_count_change: s.total_count_change,
last_instance_handle: s.last_instance_handle,
}
}
}
impl From<dds_requested_incompatible_qos_status> for RequestedIncompatibleQosStatus {
fn from(s: dds_requested_incompatible_qos_status) -> Self {
RequestedIncompatibleQosStatus {
total_count: s.total_count,
total_count_change: s.total_count_change,
last_policy_id: s.last_policy_id,
}
}
}
impl From<dds_sample_lost_status> for SampleLostStatus {
fn from(s: dds_sample_lost_status) -> Self {
SampleLostStatus {
total_count: s.total_count,
total_count_change: s.total_count_change,
}
}
}
impl From<dds_sample_rejected_status> for SampleRejectedStatus {
fn from(s: dds_sample_rejected_status) -> Self {
SampleRejectedStatus {
total_count: s.total_count,
total_count_change: s.total_count_change,
last_reason: SampleRejectedReason::from(s.last_reason),
last_instance_handle: s.last_instance_handle,
}
}
}
impl From<dds_publication_matched_status> for PublicationMatchedStatus {
fn from(s: dds_publication_matched_status) -> Self {
PublicationMatchedStatus {
total_count: s.total_count,
total_count_change: s.total_count_change,
current_count: s.current_count,
current_count_change: s.current_count_change,
last_subscription_handle: s.last_subscription_handle,
}
}
}
impl From<dds_subscription_matched_status> for SubscriptionMatchedStatus {
fn from(s: dds_subscription_matched_status) -> Self {
SubscriptionMatchedStatus {
total_count: s.total_count,
total_count_change: s.total_count_change,
current_count: s.current_count,
current_count_change: s.current_count_change,
last_publication_handle: s.last_publication_handle,
}
}
}
pub trait StatusExt: DdsEntity {
fn inconsistent_topic_status(&self) -> DdsResult<InconsistentTopicStatus> {
unsafe {
let mut raw: dds_inconsistent_topic_status_t = std::mem::zeroed();
crate::error::check(dds_get_inconsistent_topic_status(self.entity(), &mut raw))?;
Ok(InconsistentTopicStatus::from(raw))
}
}
fn liveliness_lost_status(&self) -> DdsResult<LivelinessLostStatus> {
unsafe {
let mut raw: dds_liveliness_lost_status_t = std::mem::zeroed();
crate::error::check(dds_get_liveliness_lost_status(self.entity(), &mut raw))?;
Ok(LivelinessLostStatus::from(raw))
}
}
fn liveliness_changed_status(&self) -> DdsResult<LivelinessChangedStatus> {
unsafe {
let mut raw: dds_liveliness_changed_status_t = std::mem::zeroed();
crate::error::check(dds_get_liveliness_changed_status(self.entity(), &mut raw))?;
Ok(LivelinessChangedStatus::from(raw))
}
}
fn offered_deadline_missed_status(&self) -> DdsResult<OfferedDeadlineMissedStatus> {
unsafe {
let mut raw: dds_offered_deadline_missed_status_t = std::mem::zeroed();
crate::error::check(dds_get_offered_deadline_missed_status(
self.entity(),
&mut raw,
))?;
Ok(OfferedDeadlineMissedStatus::from(raw))
}
}
fn offered_incompatible_qos_status(&self) -> DdsResult<OfferedIncompatibleQosStatus> {
unsafe {
let mut raw: dds_offered_incompatible_qos_status_t = std::mem::zeroed();
crate::error::check(dds_get_offered_incompatible_qos_status(
self.entity(),
&mut raw,
))?;
Ok(OfferedIncompatibleQosStatus::from(raw))
}
}
fn requested_deadline_missed_status(&self) -> DdsResult<RequestedDeadlineMissedStatus> {
unsafe {
let mut raw: dds_requested_deadline_missed_status_t = std::mem::zeroed();
crate::error::check(dds_get_requested_deadline_missed_status(
self.entity(),
&mut raw,
))?;
Ok(RequestedDeadlineMissedStatus::from(raw))
}
}
fn requested_incompatible_qos_status(&self) -> DdsResult<RequestedIncompatibleQosStatus> {
unsafe {
let mut raw: dds_requested_incompatible_qos_status_t = std::mem::zeroed();
crate::error::check(dds_get_requested_incompatible_qos_status(
self.entity(),
&mut raw,
))?;
Ok(RequestedIncompatibleQosStatus::from(raw))
}
}
fn sample_lost_status(&self) -> DdsResult<SampleLostStatus> {
unsafe {
let mut raw: dds_sample_lost_status_t = std::mem::zeroed();
crate::error::check(dds_get_sample_lost_status(self.entity(), &mut raw))?;
Ok(SampleLostStatus::from(raw))
}
}
fn sample_rejected_status(&self) -> DdsResult<SampleRejectedStatus> {
unsafe {
let mut raw: dds_sample_rejected_status_t = std::mem::zeroed();
crate::error::check(dds_get_sample_rejected_status(self.entity(), &mut raw))?;
Ok(SampleRejectedStatus::from(raw))
}
}
fn publication_matched_status(&self) -> DdsResult<PublicationMatchedStatus> {
unsafe {
let mut raw: dds_publication_matched_status_t = std::mem::zeroed();
crate::error::check(dds_get_publication_matched_status(self.entity(), &mut raw))?;
Ok(PublicationMatchedStatus::from(raw))
}
}
fn subscription_matched_status(&self) -> DdsResult<SubscriptionMatchedStatus> {
unsafe {
let mut raw: dds_subscription_matched_status_t = std::mem::zeroed();
crate::error::check(dds_get_subscription_matched_status(self.entity(), &mut raw))?;
Ok(SubscriptionMatchedStatus::from(raw))
}
}
}
impl<T: DdsEntity + ?Sized> StatusExt for T {}