Skip to main content

eventuary_core/io/acker/
either.rs

1use 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}