1use crate::ListenerError;
4
5#[derive(Debug)]
10#[must_use = "DispatchResult carries listener errors that will be silently dropped if ignored"]
11pub struct DispatchResult {
12 results: Vec<Result<(), ListenerError>>,
13 blocked: bool,
14 listener_count: usize,
15}
16
17impl DispatchResult {
18 pub(crate) fn new(results: Vec<Result<(), ListenerError>>) -> Self {
19 let listener_count = results.len();
20 Self {
21 results,
22 blocked: false,
23 listener_count,
24 }
25 }
26
27 pub(crate) fn blocked() -> Self {
28 Self {
29 results: Vec::new(),
30 blocked: true,
31 listener_count: 0,
32 }
33 }
34
35 #[must_use]
37 pub fn is_blocked(&self) -> bool {
38 self.blocked
39 }
40
41 #[must_use]
43 pub fn listener_count(&self) -> usize {
44 self.listener_count
45 }
46
47 #[must_use]
49 pub fn success_count(&self) -> usize {
50 self.results.iter().filter(|r| r.is_ok()).count()
51 }
52
53 #[must_use]
55 pub fn error_count(&self) -> usize {
56 self.results.iter().filter(|r| r.is_err()).count()
57 }
58
59 #[must_use]
61 pub fn errors(&self) -> Vec<&ListenerError> {
62 self.results
63 .iter()
64 .filter_map(|r| r.as_ref().err())
65 .collect()
66 }
67
68 #[must_use]
73 pub fn all_succeeded(&self) -> bool {
74 !self.blocked && self.results.iter().all(|r| r.is_ok())
75 }
76
77 #[must_use]
79 pub fn has_errors(&self) -> bool {
80 self.results.iter().any(|r| r.is_err())
81 }
82}