use apalis_core::{backend::BackendExt, error::BoxDynError};
use crate::sequential::router::WorkflowRouter;
pub trait Layer<S> {
type Step;
fn layer(&self, step: S) -> Self::Step;
}
pub trait Step<Input, B>
where
B: BackendExt,
{
type Response;
type Error;
fn register(&mut self, router: &mut WorkflowRouter<B>) -> Result<(), BoxDynError>;
}
#[derive(Clone, Debug)]
pub struct Identity;
impl<S> Layer<S> for Identity {
type Step = S;
fn layer(&self, step: S) -> Self::Step {
step
}
}
#[derive(Clone, Debug)]
pub struct Stack<Inner, Outer> {
inner: Inner,
outer: Outer,
}
impl<Inner, Outer> Stack<Inner, Outer> {
pub const fn new(inner: Inner, outer: Outer) -> Self {
Self { inner, outer }
}
}
impl<S, Inner, Outer> Layer<S> for Stack<Inner, Outer>
where
Inner: Layer<S>,
Outer: Layer<Inner::Step>,
{
type Step = Outer::Step;
fn layer(&self, service: S) -> Self::Step {
let inner = self.inner.layer(service);
self.outer.layer(inner)
}
}