1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
//! Publication (ADR 0008, ADR 0032).
use crateSerializedEnvelope;
use crateClassify;
/// The wire side of the outbox. One provider implements this per transport.
///
/// A publish **timeout** classifies as [`crate::FailureKind::Transient`]. A payload the broker
/// rejects as too large classifies as [`crate::FailureKind::Permanent`] — retrying forever
/// cannot help.
///
/// ```
/// use core::fmt;
///
/// use reliar_core::{Classify, FailureKind, Publisher, SerializedEnvelope};
///
/// /// A toy publisher that always succeeds — enough to satisfy the trait's bounds.
/// struct NoopPublisher;
///
/// #[derive(Debug)]
/// struct NoopError;
/// impl fmt::Display for NoopError {
/// fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
/// f.write_str("unreachable")
/// }
/// }
/// impl std::error::Error for NoopError {}
/// impl Classify for NoopError {
/// fn kind(&self) -> FailureKind {
/// FailureKind::Permanent
/// }
/// }
///
/// impl Publisher for NoopPublisher {
/// type Error = NoopError;
///
/// fn publish(
/// &self,
/// _envelope: &SerializedEnvelope,
/// ) -> impl Future<Output = Result<(), Self::Error>> + Send {
/// async { Ok(()) }
/// }
/// }
/// ```