strut_rabbitmq/transport/inbound/envelope/
stack.rs

1use crate::Envelope;
2use async_trait::async_trait;
3use futures::future::join_all;
4use nonempty::NonEmpty;
5
6/// Represents a collection of [`Envelope`]s that can be acted upon with included
7/// convenience methods.
8#[async_trait]
9pub trait EnvelopeStack {
10    /// Efficiently calls [`complete`](Envelope::complete) on every envelope in
11    /// this stack.
12    async fn complete_all(self);
13
14    /// Efficiently calls [`backwash`](Envelope::backwash) on every envelope in
15    /// this stack.
16    async fn backwash_all(self);
17
18    /// Efficiently calls [`abandon`](Envelope::abandon) on every envelope in
19    /// this stack.
20    async fn abandon_all(self);
21}
22
23/// Implements [`EnvelopeStack`] for a vector of [`Envelope`]s.
24#[async_trait]
25impl<T> EnvelopeStack for Vec<Envelope<T>>
26where
27    T: Send,
28{
29    async fn complete_all(self) {
30        join_all(self.into_iter().map(|envelope| envelope.complete())).await;
31    }
32
33    async fn backwash_all(self) {
34        join_all(self.into_iter().map(|envelope| envelope.backwash())).await;
35    }
36
37    async fn abandon_all(self) {
38        join_all(self.into_iter().map(|envelope| envelope.abandon())).await;
39    }
40}
41
42/// Implements [`EnvelopeStack`] for a [`NonEmpty`] collection of [`Envelope`]s.
43#[async_trait]
44impl<T> EnvelopeStack for NonEmpty<Envelope<T>>
45where
46    T: Send,
47{
48    async fn complete_all(self) {
49        join_all(self.into_iter().map(|envelope| envelope.complete())).await;
50    }
51
52    async fn backwash_all(self) {
53        join_all(self.into_iter().map(|envelope| envelope.backwash())).await;
54    }
55
56    async fn abandon_all(self) {
57        join_all(self.into_iter().map(|envelope| envelope.abandon())).await;
58    }
59}