1use std::future::Future;
2use std::marker::PhantomData;
3
4use crate::saga::ActionComputation;
5
6#[cfg(not(feature = "not-send-futures"))]
13pub trait ActionPublisher<A, Error> {
14 fn publish(&self, action: &[A]) -> impl Future<Output = Result<Vec<A>, Error>> + Send;
18}
19
20#[cfg(feature = "not-send-futures")]
27pub trait ActionPublisher<A, Error> {
28 fn publish(&self, action: &[A]) -> impl Future<Output = Result<Vec<A>, Error>>;
32}
33
34pub struct SagaManager<A, AR, Publisher, Saga, Error>
45where
46 Publisher: ActionPublisher<A, Error>,
47 Saga: ActionComputation<AR, A>,
48{
49 action_publisher: Publisher,
50 saga: Saga,
51 _marker: PhantomData<(A, AR, Error)>,
52}
53
54impl<A, AR, Publisher, Saga, Error> ActionComputation<AR, A>
55 for SagaManager<A, AR, Publisher, Saga, Error>
56where
57 Publisher: ActionPublisher<A, Error>,
58 Saga: ActionComputation<AR, A>,
59{
60 fn compute_new_actions(&self, action_result: &AR) -> Vec<A> {
62 self.saga.compute_new_actions(action_result)
63 }
64}
65
66#[cfg(not(feature = "not-send-futures"))]
67impl<A, AR, Publisher, Saga, Error> ActionPublisher<A, Error>
68 for SagaManager<A, AR, Publisher, Saga, Error>
69where
70 Publisher: ActionPublisher<A, Error> + Sync,
71 Saga: ActionComputation<AR, A> + Sync,
72 A: Sync,
73 AR: Sync,
74 Error: Sync,
75{
76 async fn publish(&self, action: &[A]) -> Result<Vec<A>, Error> {
78 self.action_publisher.publish(action).await
79 }
80}
81
82#[cfg(feature = "not-send-futures")]
83impl<A, AR, Publisher, Saga, Error> ActionPublisher<A, Error>
84 for SagaManager<A, AR, Publisher, Saga, Error>
85where
86 Publisher: ActionPublisher<A, Error>,
87 Saga: ActionComputation<AR, A>,
88{
89 async fn publish(&self, action: &[A]) -> Result<Vec<A>, Error> {
91 self.action_publisher.publish(action).await
92 }
93}
94
95#[cfg(not(feature = "not-send-futures"))]
96impl<A, AR, Publisher, Saga, Error> SagaManager<A, AR, Publisher, Saga, Error>
97where
98 Publisher: ActionPublisher<A, Error> + Sync,
99 Saga: ActionComputation<AR, A> + Sync,
100 A: Sync,
101 AR: Sync,
102 Error: Sync,
103{
104 pub fn new(action_publisher: Publisher, saga: Saga) -> Self {
106 SagaManager {
107 action_publisher,
108 saga,
109 _marker: PhantomData,
110 }
111 }
112 pub async fn handle(&self, action_result: &AR) -> Result<Vec<A>, Error> {
117 let new_actions = self.compute_new_actions(action_result);
118 let published_actions = self.publish(&new_actions).await?;
119 Ok(published_actions)
120 }
121}
122
123#[cfg(feature = "not-send-futures")]
124impl<A, AR, Publisher, Saga, Error> SagaManager<A, AR, Publisher, Saga, Error>
125where
126 Publisher: ActionPublisher<A, Error>,
127 Saga: ActionComputation<AR, A>,
128{
129 pub fn new(action_publisher: Publisher, saga: Saga) -> Self {
131 SagaManager {
132 action_publisher,
133 saga,
134 _marker: PhantomData,
135 }
136 }
137 pub async fn handle(&self, action_result: &AR) -> Result<Vec<A>, Error> {
142 let new_actions = self.compute_new_actions(action_result);
143 let published_actions = self.publish(&new_actions).await?;
144 Ok(published_actions)
145 }
146}