use core::time::Duration;
use zerodds_qos::policies::durability_service::DurabilityServiceQosPolicy;
use zerodds_qos::policies::history::HistoryKind;
use zerodds_qos::policies::resource_limits::LENGTH_UNLIMITED;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Contract {
pub history_kind: HistoryKind,
pub history_depth: i32,
pub max_samples: i32,
pub max_instances: i32,
pub max_samples_per_instance: i32,
pub cleanup_delay: Duration,
}
impl Contract {
#[must_use]
pub fn from_qos(qos: &DurabilityServiceQosPolicy) -> Self {
Self {
history_kind: qos.history_kind,
history_depth: qos.history_depth,
max_samples: qos.max_samples,
max_instances: qos.max_instances,
max_samples_per_instance: qos.max_samples_per_instance,
cleanup_delay: cleanup_delay(qos),
}
}
#[must_use]
pub fn keep_all() -> Self {
Self {
history_kind: HistoryKind::KeepAll,
history_depth: 0,
max_samples: LENGTH_UNLIMITED,
max_instances: LENGTH_UNLIMITED,
max_samples_per_instance: LENGTH_UNLIMITED,
cleanup_delay: core::time::Duration::ZERO,
}
}
#[must_use]
pub fn effective_depth(&self) -> usize {
if self.history_depth <= 0 {
1
} else {
self.history_depth as usize
}
}
#[must_use]
pub fn samples_bounded(&self) -> bool {
self.max_samples != LENGTH_UNLIMITED
}
#[must_use]
pub fn instances_bounded(&self) -> bool {
self.max_instances != LENGTH_UNLIMITED
}
#[must_use]
pub fn per_instance_bounded(&self) -> bool {
self.max_samples_per_instance != LENGTH_UNLIMITED
}
}
impl Default for Contract {
fn default() -> Self {
Self::from_qos(&DurabilityServiceQosPolicy::default())
}
}
fn cleanup_delay(qos: &DurabilityServiceQosPolicy) -> Duration {
let secs = u64::try_from(qos.service_cleanup_delay.seconds.max(0)).unwrap_or(0);
let frac = u64::from(qos.service_cleanup_delay.fraction);
let nanos = (frac.saturating_mul(1_000_000_000) >> 32) as u32;
Duration::new(secs, nanos)
}