apalis_workflow/sequential/
step.rs1use apalis_core::{
2 backend::{Backend, WireFormatBackend},
3 error::BoxDynError,
4};
5
6use crate::sequential::router::WorkflowRouter;
7
8pub trait Layer<S> {
10 type Step;
12 fn layer(&self, step: S) -> Self::Step;
14}
15
16pub trait Step<Input, B>
20where
21 B: Backend + WireFormatBackend,
22{
23 type Response;
25 type Error;
27
28 fn register(&mut self, router: &mut WorkflowRouter<B>) -> Result<(), BoxDynError>;
30}
31
32#[derive(Clone, Debug)]
34pub struct Identity;
35
36impl<S> Layer<S> for Identity {
37 type Step = S;
38
39 fn layer(&self, step: S) -> Self::Step {
40 step
41 }
42}
43
44#[derive(Clone, Debug)]
46pub struct Stack<Inner, Outer> {
47 inner: Inner,
48 outer: Outer,
49}
50impl<Inner, Outer> Stack<Inner, Outer> {
51 pub const fn new(inner: Inner, outer: Outer) -> Self {
53 Self { inner, outer }
54 }
55}
56
57impl<S, Inner, Outer> Layer<S> for Stack<Inner, Outer>
58where
59 Inner: Layer<S>,
60 Outer: Layer<Inner::Step>,
61{
62 type Step = Outer::Step;
63
64 fn layer(&self, service: S) -> Self::Step {
65 let inner = self.inner.layer(service);
66
67 self.outer.layer(inner)
68 }
69}