use std::error::Error;
use std::marker::PhantomData;
use zrx_scheduler::schedule::{self, Shared};
use zrx_scheduler::{Id, Value};
use crate::stream::Stream;
use super::Workflow;
#[derive(Debug, PartialEq, Eq)]
pub struct Builder<I> {
schedule: Shared<schedule::Builder<I>>,
}
impl<I> Workflow<I>
where
I: Id,
{
#[inline]
#[must_use]
pub fn builder() -> Builder<I> {
Builder::default()
}
#[allow(clippy::missing_panics_doc)]
pub fn with<F, E>(f: F) -> Result<Self, E>
where
F: FnOnce(Builder<I>) -> Result<(), E>,
E: Error,
{
let builder = Builder::default();
f(builder.clone()).map(|()| {
let Builder { schedule } = builder;
let builder = schedule.try_into_inner().expect("invariant");
Self { schedule: builder.build() }
})
}
}
impl<I> Builder<I>
where
I: Id,
{
#[inline]
pub fn add<T>(&self) -> Stream<I, T>
where
T: Value,
{
Stream {
id: self.schedule.with_mut(schedule::Builder::add_source::<T>),
workflow: self.clone(),
marker: PhantomData,
}
}
pub fn build(self) -> Result<Workflow<I>, Self> {
self.schedule
.try_into_inner()
.map(|builder| Workflow { schedule: builder.build() })
.map_err(|schedule| Self { schedule })
}
pub(crate) fn with<F, R>(&self, f: F) -> R
where
F: FnOnce(&mut schedule::Builder<I>) -> R,
{
self.schedule.with_mut(f)
}
}
impl<I> Builder<I> {
pub(crate) fn clone(&self) -> Self {
Self {
schedule: self.schedule.clone(),
}
}
}
impl<I> Default for Builder<I> {
#[inline]
fn default() -> Self {
Self { schedule: Shared::default() }
}
}