use crate::scheduler::signal::Id;
use crate::scheduler::step::effect::timer::{IntoDuration, IntoInstant};
use crate::scheduler::step::effect::{Effect, Timer};
use crate::scheduler::step::{Result, Scoped, Step, Steps};
pub struct Builder<I, C> {
scope: Scoped<I>,
data: Option<Steps<I, C>>,
}
impl<I> Scoped<I>
where
I: Id,
{
#[must_use]
pub fn timer<C>(&self) -> Builder<I, C> {
Builder {
scope: self.clone(),
data: None,
}
}
}
impl<I, C> Builder<I, C>
where
I: Id,
{
#[must_use]
pub fn data(mut self, data: Steps<I, C>) -> Self {
self.data = Some(data);
self
}
#[allow(clippy::missing_errors_doc)]
#[inline]
pub fn set<T>(self, deadline: T) -> Result<Steps<I, C>>
where
T: IntoInstant,
{
Ok(Steps::from(Step::new(
self.scope,
Effect::Timer(Timer::Set {
deadline: deadline.into_instant(),
data: self.data,
}),
)))
}
#[allow(clippy::missing_errors_doc)]
#[inline]
pub fn reset<T>(self, deadline: T) -> Result<Steps<I, C>>
where
T: IntoInstant,
{
Ok(Steps::from(Step::new(
self.scope,
Effect::Timer(Timer::Reset {
deadline: deadline.into_instant(),
data: self.data,
}),
)))
}
#[allow(clippy::missing_errors_doc)]
#[inline]
pub fn repeat<T>(self, interval: T) -> Result<Steps<I, C>>
where
T: IntoDuration,
{
Ok(Steps::from(Step::new(
self.scope,
Effect::Timer(Timer::Repeat {
interval: interval.into_duration(),
data: self.data,
}),
)))
}
#[allow(clippy::missing_errors_doc)]
#[inline]
pub fn clear(self) -> Result<Steps<I, C>> {
Ok(Steps::from(Step::new(
self.scope,
Effect::Timer(Timer::Clear),
)))
}
}