use super::condition::StatusCondition;
use crate::{
dds_async::wait_set::{ConditionAsync, WaitSetAsync},
infrastructure::{error::DdsResult, time::Duration},
std_runtime::executor::{block_on, block_timeout},
};
use alloc::vec::Vec;
#[derive(Clone)]
pub enum Condition {
StatusCondition(StatusCondition),
}
impl Condition {
#[tracing::instrument(skip(self))]
pub fn get_trigger_value(&self) -> DdsResult<bool> {
match self {
Condition::StatusCondition(c) => c.get_trigger_value(),
}
}
}
#[derive(Default)]
pub struct WaitSet {
waitset_async: WaitSetAsync,
}
impl WaitSet {
#[tracing::instrument]
pub fn new() -> Self {
Self::default()
}
#[tracing::instrument(skip(self))]
pub fn wait(&self, timeout: Duration) -> DdsResult<Vec<Condition>> {
Ok(block_timeout(timeout.into(), self.waitset_async.wait())??
.into_iter()
.map(|c| match c {
ConditionAsync::StatusCondition(sc) => {
Condition::StatusCondition(StatusCondition::new(sc))
}
})
.collect())
}
#[tracing::instrument(skip(self, cond))]
pub fn attach_condition(&mut self, cond: Condition) -> DdsResult<()> {
match cond {
Condition::StatusCondition(sc) => block_on(self.waitset_async.attach_condition(
ConditionAsync::StatusCondition(sc.condition_async().clone()),
)),
}
}
#[tracing::instrument(skip(self, _cond))]
pub fn detach_condition(&self, _cond: Condition) -> DdsResult<()> {
todo!()
}
#[tracing::instrument(skip(self))]
pub fn get_conditions(&self) -> DdsResult<Vec<Condition>> {
Ok(block_on(self.waitset_async.get_conditions())?
.into_iter()
.map(|c| match c {
ConditionAsync::StatusCondition(sc) => {
Condition::StatusCondition(StatusCondition::new(sc))
}
})
.collect())
}
}