eventuary_core/io/acker/
either.rs1use either::Either;
2
3use crate::error::Result;
4use crate::io::Acker;
5use crate::io::acker::NackContext;
6
7impl<L: Acker, R: Acker> Acker for Either<L, R> {
8 async fn ack(&self) -> Result<()> {
9 match self {
10 Either::Left(a) => a.ack().await,
11 Either::Right(a) => a.ack().await,
12 }
13 }
14
15 async fn nack(&self) -> Result<()> {
16 match self {
17 Either::Left(a) => a.nack().await,
18 Either::Right(a) => a.nack().await,
19 }
20 }
21
22 async fn nack_with(&self, context: NackContext) -> Result<()> {
23 match self {
24 Either::Left(a) => a.nack_with(context).await,
25 Either::Right(a) => a.nack_with(context).await,
26 }
27 }
28}
29
30#[cfg(test)]
31mod tests {
32 use super::*;
33
34 use std::sync::Arc;
35 use std::sync::atomic::{AtomicUsize, Ordering};
36
37 struct Counting {
38 ack: Arc<AtomicUsize>,
39 nack: Arc<AtomicUsize>,
40 }
41
42 impl Acker for Counting {
43 async fn ack(&self) -> Result<()> {
44 self.ack.fetch_add(1, Ordering::SeqCst);
45 Ok(())
46 }
47 async fn nack(&self) -> Result<()> {
48 self.nack.fetch_add(1, Ordering::SeqCst);
49 Ok(())
50 }
51 }
52
53 #[tokio::test]
54 async fn left_dispatches_to_left() {
55 let ack = Arc::new(AtomicUsize::new(0));
56 let nack = Arc::new(AtomicUsize::new(0));
57 let acker: Either<Counting, Counting> = Either::Left(Counting {
58 ack: Arc::clone(&ack),
59 nack: Arc::clone(&nack),
60 });
61 acker.ack().await.unwrap();
62 acker.nack().await.unwrap();
63 assert_eq!(ack.load(Ordering::SeqCst), 1);
64 assert_eq!(nack.load(Ordering::SeqCst), 1);
65 }
66
67 #[tokio::test]
68 async fn right_dispatches_to_right() {
69 let ack = Arc::new(AtomicUsize::new(0));
70 let nack = Arc::new(AtomicUsize::new(0));
71 let acker: Either<Counting, Counting> = Either::Right(Counting {
72 ack: Arc::clone(&ack),
73 nack: Arc::clone(&nack),
74 });
75 acker.ack().await.unwrap();
76 acker.nack().await.unwrap();
77 assert_eq!(ack.load(Ordering::SeqCst), 1);
78 assert_eq!(nack.load(Ordering::SeqCst), 1);
79 }
80}