@@ -91,6 +91,14 @@ pub enum Error {
91
91
#[ cfg( feature = "multi-thread" ) ]
92
92
#[ error( "failed to send message to channel: {0}" ) ]
93
93
SendToChannel ( SendToChannelError , SendToChannelErrorDropped ) ,
94
+
95
+ /// This variant returned when multiple errors occurred.
96
+ #[ error( "{0:?}" ) ]
97
+ Multiple ( Vec < Error > ) ,
98
+
99
+ #[ cfg( test) ]
100
+ #[ error( "{0}" ) ]
101
+ __ForInternalTestsUseOnly( i32 ) ,
94
102
}
95
103
96
104
/// This error type contains a variety of possible invalid arguments.
@@ -180,6 +188,26 @@ pub enum SendToChannelErrorDropped {
180
188
Flush ,
181
189
}
182
190
191
+ impl Error {
192
+ pub ( crate ) fn push_err < T > ( result : Result < T > , new : Self ) -> Result < T > {
193
+ match result {
194
+ Ok ( _) => Err ( new) ,
195
+ Err ( Self :: Multiple ( mut errors) ) => {
196
+ errors. push ( new) ;
197
+ Err ( Self :: Multiple ( errors) )
198
+ }
199
+ Err ( prev) => Err ( Error :: Multiple ( vec ! [ prev, new] ) ) ,
200
+ }
201
+ }
202
+
203
+ pub ( crate ) fn push_result < T , N > ( result : Result < T > , new : Result < N > ) -> Result < T > {
204
+ match new {
205
+ Ok ( _) => result,
206
+ Err ( err) => Self :: push_err ( result, err) ,
207
+ }
208
+ }
209
+ }
210
+
183
211
#[ cfg( feature = "multi-thread" ) ]
184
212
impl Error {
185
213
#[ must_use]
@@ -222,3 +250,27 @@ pub type ErrorHandler = fn(Error);
222
250
223
251
const_assert ! ( Atomic :: <ErrorHandler >:: is_lock_free( ) ) ;
224
252
const_assert ! ( Atomic :: <Option <ErrorHandler >>:: is_lock_free( ) ) ;
253
+
254
+ #[ cfg( test) ]
255
+ mod tests {
256
+ use super :: * ;
257
+
258
+ #[ test]
259
+ fn push_err ( ) {
260
+ macro_rules! make_err {
261
+ ( $( $inputs: tt) + ) => {
262
+ Error :: __ForInternalTestsUseOnly( $( $inputs) * )
263
+ } ;
264
+ }
265
+
266
+ assert ! ( matches!(
267
+ Error :: push_err( Ok ( ( ) ) , make_err!( 1 ) ) ,
268
+ Err ( make_err!( 1 ) )
269
+ ) ) ;
270
+
271
+ assert ! ( matches!(
272
+ Error :: push_err:: <( ) >( Err ( make_err!( 1 ) ) , make_err!( 2 ) ) ,
273
+ Err ( Error :: Multiple ( v) ) if matches!( v[ ..] , [ make_err!( 1 ) , make_err!( 2 ) ] )
274
+ ) ) ;
275
+ }
276
+ }
0 commit comments