use cyclors::{qos::*, DDS_LENGTH_UNLIMITED};
pub fn get_history_or_default(qos: &Qos) -> History {
match &qos.history {
None => History::default(),
Some(history) => history.clone(),
}
}
pub fn get_durability_service_or_default(qos: &Qos) -> DurabilityService {
match &qos.durability_service {
None => DurabilityService::default(),
Some(durability_service) => durability_service.clone(),
}
}
pub fn is_reliable(qos: &Qos) -> bool {
qos.reliability
.as_ref()
.is_some_and(|reliability| reliability.kind == ReliabilityKind::RELIABLE)
}
pub fn is_transient_local(qos: &Qos) -> bool {
qos.durability
.as_ref()
.is_some_and(|durability| durability.kind == DurabilityKind::TRANSIENT_LOCAL)
}
pub fn adapt_writer_qos_for_reader(qos: &Qos) -> Qos {
let mut reader_qos = qos.clone();
reader_qos.durability_service = None;
reader_qos.ownership_strength = None;
reader_qos.transport_priority = None;
reader_qos.lifespan = None;
reader_qos.writer_data_lifecycle = None;
reader_qos.writer_batching = None;
reader_qos.properties = None;
reader_qos.entity_name = None;
reader_qos.ignore_local = Some(IgnoreLocal {
kind: IgnoreLocalKind::PARTICIPANT,
});
if reader_qos.reliability.is_none() {
reader_qos.reliability = Some({
Reliability {
kind: ReliabilityKind::BEST_EFFORT,
max_blocking_time: DDS_100MS_DURATION,
}
});
}
reader_qos
}
pub fn adapt_reader_qos_for_writer(qos: &Qos) -> Qos {
let mut writer_qos = qos.clone();
writer_qos.time_based_filter = None;
writer_qos.reader_data_lifecycle = None;
writer_qos.properties = None;
writer_qos.entity_name = None;
writer_qos.ignore_local = Some(IgnoreLocal {
kind: IgnoreLocalKind::PARTICIPANT,
});
if is_transient_local(qos) {
let history = qos
.history
.as_ref()
.map_or(History::default(), |history| history.clone());
writer_qos.durability_service = Some(DurabilityService {
service_cleanup_delay: 60 * DDS_1S_DURATION,
history_kind: history.kind,
history_depth: history.depth,
max_samples: DDS_LENGTH_UNLIMITED,
max_instances: DDS_LENGTH_UNLIMITED,
max_samples_per_instance: DDS_LENGTH_UNLIMITED,
});
}
writer_qos.reliability = match writer_qos.reliability {
Some(mut reliability) => {
reliability.max_blocking_time = reliability.max_blocking_time.saturating_add(1);
Some(reliability)
}
_ => {
let mut reliability = Reliability {
kind: ReliabilityKind::RELIABLE,
max_blocking_time: DDS_100MS_DURATION,
};
reliability.max_blocking_time = reliability.max_blocking_time.saturating_add(1);
Some(reliability)
}
};
writer_qos
}