fmodel_rust/
saga_manager.rs1use std::future::Future;
2use std::marker::PhantomData;
3
4use crate::saga::ActionComputation;
5
6pub trait ActionPublisher<A, Error> {
13 fn publish(&self, action: &[A]) -> impl Future<Output = Result<Vec<A>, Error>> + Send;
17}
18
19pub struct SagaManager<A, AR, Publisher, Saga, Error>
30where
31 Publisher: ActionPublisher<A, Error>,
32 Saga: ActionComputation<AR, A>,
33{
34 action_publisher: Publisher,
35 saga: Saga,
36 _marker: PhantomData<(A, AR, Error)>,
37}
38
39impl<A, AR, Publisher, Saga, Error> ActionComputation<AR, A>
40 for SagaManager<A, AR, Publisher, Saga, Error>
41where
42 Publisher: ActionPublisher<A, Error>,
43 Saga: ActionComputation<AR, A>,
44{
45 fn compute_new_actions(&self, action_result: &AR) -> Vec<A> {
47 self.saga.compute_new_actions(action_result)
48 }
49}
50
51impl<A, AR, Publisher, Saga, Error> ActionPublisher<A, Error>
52 for SagaManager<A, AR, Publisher, Saga, Error>
53where
54 Publisher: ActionPublisher<A, Error> + Sync,
55 Saga: ActionComputation<AR, A> + Sync,
56 A: Sync,
57 AR: Sync,
58 Error: Sync,
59{
60 async fn publish(&self, action: &[A]) -> Result<Vec<A>, Error> {
62 self.action_publisher.publish(action).await
63 }
64}
65
66impl<A, AR, Publisher, Saga, Error> SagaManager<A, AR, Publisher, Saga, Error>
67where
68 Publisher: ActionPublisher<A, Error> + Sync,
69 Saga: ActionComputation<AR, A> + Sync,
70 A: Sync,
71 AR: Sync,
72 Error: Sync,
73{
74 pub fn new(action_publisher: Publisher, saga: Saga) -> Self {
76 SagaManager {
77 action_publisher,
78 saga,
79 _marker: PhantomData,
80 }
81 }
82 pub async fn handle(&self, action_result: &AR) -> Result<Vec<A>, Error> {
87 let new_actions = self.compute_new_actions(action_result);
88 let published_actions = self.publish(&new_actions).await?;
89 Ok(published_actions)
90 }
91}