@@ -87,7 +87,7 @@ impl Error {
87
87
if self . is_network_error ( ) {
88
88
return true ;
89
89
}
90
- match & self . kind . code ( ) {
90
+ match self . code ( ) {
91
91
Some ( code) => {
92
92
RETRYABLE_READ_CODES . contains ( & code)
93
93
}
@@ -110,7 +110,7 @@ impl Error {
110
110
if self . is_network_error ( ) {
111
111
return true ;
112
112
}
113
- match & self . kind . code ( ) {
113
+ match & self . code ( ) {
114
114
Some ( code) => RETRYABLE_WRITE_CODES . contains ( & code) ,
115
115
None => false ,
116
116
}
@@ -193,6 +193,98 @@ impl Error {
193
193
pub ( crate ) fn from_resolve_error ( error : trust_dns_resolver:: error:: ResolveError ) -> Self {
194
194
ErrorKind :: DnsResolveError { message : error. to_string ( ) } . into ( )
195
195
}
196
+
197
+ pub ( crate ) fn is_non_timeout_network_error ( & self ) -> bool {
198
+ matches ! ( self . kind. as_ref( ) , ErrorKind :: Io ( ref io_err) if io_err. kind( ) != std:: io:: ErrorKind :: TimedOut )
199
+ }
200
+
201
+ pub ( crate ) fn is_network_error ( & self ) -> bool {
202
+ matches ! (
203
+ self . kind. as_ref( ) ,
204
+ ErrorKind :: Io ( ..) | ErrorKind :: ConnectionPoolClearedError { .. }
205
+ )
206
+ }
207
+
208
+ /// Gets the code from this error for performing SDAM updates, if applicable.
209
+ /// Any codes contained in WriteErrors are ignored.
210
+ pub ( crate ) fn code ( & self ) -> Option < i32 > {
211
+ match self . kind . as_ref ( ) {
212
+ ErrorKind :: CommandError ( command_error) => {
213
+ Some ( command_error. code )
214
+ } ,
215
+ // According to SDAM spec, write concern error codes MUST also be checked, and writeError codes
216
+ // MUST NOT be checked.
217
+ ErrorKind :: BulkWriteError ( BulkWriteFailure { write_concern_error : Some ( wc_error) , .. } ) => {
218
+ Some ( wc_error. code )
219
+ }
220
+ ErrorKind :: WriteError ( WriteFailure :: WriteConcernError ( wc_error) ) => Some ( wc_error. code ) ,
221
+ _ => None
222
+ }
223
+ }
224
+
225
+ /// Gets the server's message for this error, if applicable, for use in testing.
226
+ /// If this error is a BulkWriteError, the messages are concatenated.
227
+ #[ cfg( test) ]
228
+ pub ( crate ) fn server_message ( & self ) -> Option < String > {
229
+ match self . kind . as_ref ( ) {
230
+ ErrorKind :: CommandError ( command_error) => {
231
+ Some ( command_error. message . clone ( ) )
232
+ } ,
233
+ // since this is used primarily for errorMessageContains assertions in the unified runner, we just
234
+ // concatenate all the relevant server messages into one for bulk errors.
235
+ ErrorKind :: BulkWriteError ( BulkWriteFailure { write_concern_error, write_errors } ) => {
236
+ let mut msg = "" . to_string ( ) ;
237
+ if let Some ( wc_error) = write_concern_error {
238
+ msg. push_str ( wc_error. message . as_str ( ) ) ;
239
+ }
240
+ if let Some ( write_errors) = write_errors {
241
+ for we in write_errors {
242
+ msg. push_str ( we. message . as_str ( ) ) ;
243
+ }
244
+ }
245
+ Some ( msg)
246
+ }
247
+ ErrorKind :: WriteError ( WriteFailure :: WriteConcernError ( wc_error) ) => Some ( wc_error. message . clone ( ) ) ,
248
+ ErrorKind :: WriteError ( WriteFailure :: WriteError ( write_error) ) => Some ( write_error. message . clone ( ) ) ,
249
+ _ => None
250
+ }
251
+ }
252
+
253
+ /// Gets the code name from this error, if applicable.
254
+ #[ cfg( test) ]
255
+ pub ( crate ) fn code_name ( & self ) -> Option < & str > {
256
+ match self . kind . as_ref ( ) {
257
+ ErrorKind :: CommandError ( ref cmd_err) => Some ( cmd_err. code_name . as_str ( ) ) ,
258
+ ErrorKind :: WriteError ( ref failure) => match failure {
259
+ WriteFailure :: WriteConcernError ( ref wce) => Some ( wce. code_name . as_str ( ) ) ,
260
+ WriteFailure :: WriteError ( ref we) => we. code_name . as_deref ( ) ,
261
+ } ,
262
+ ErrorKind :: BulkWriteError ( ref bwe) => bwe
263
+ . write_concern_error
264
+ . as_ref ( )
265
+ . map ( |wce| wce. code_name . as_str ( ) ) ,
266
+ _ => None ,
267
+ }
268
+ }
269
+
270
+ /// If this error corresponds to a "not master" error as per the SDAM spec.
271
+ pub ( crate ) fn is_not_master ( & self ) -> bool {
272
+ self . code ( ) . map ( |code| NOTMASTER_CODES . contains ( & code) ) . unwrap_or ( false )
273
+ }
274
+
275
+ /// If this error corresponds to a "node is recovering" error as per the SDAM spec.
276
+ pub ( crate ) fn is_recovering ( & self ) -> bool {
277
+ self . code ( )
278
+ . map ( |code| RECOVERING_CODES . contains ( & code) )
279
+ . unwrap_or ( false )
280
+ }
281
+
282
+ /// If this error corresponds to a "node is shutting down" error as per the SDAM spec.
283
+ pub ( crate ) fn is_shutting_down ( & self ) -> bool {
284
+ self . code ( )
285
+ . map ( |code| SHUTTING_DOWN_CODES . contains ( & code) )
286
+ . unwrap_or ( false )
287
+ }
196
288
}
197
289
198
290
impl < E > From < E > for Error
@@ -231,14 +323,6 @@ impl From<std::io::ErrorKind> for ErrorKind {
231
323
}
232
324
}
233
325
234
- impl std:: ops:: Deref for Error {
235
- type Target = ErrorKind ;
236
-
237
- fn deref ( & self ) -> & Self :: Target {
238
- & self . kind
239
- }
240
- }
241
-
242
326
/// The types of errors that can occur.
243
327
#[ allow( missing_docs) ]
244
328
#[ derive( Clone , Debug , Error ) ]
@@ -320,99 +404,6 @@ pub enum ErrorKind {
320
404
WriteError ( WriteFailure ) ,
321
405
}
322
406
323
- impl ErrorKind {
324
- pub ( crate ) fn is_non_timeout_network_error ( & self ) -> bool {
325
- matches ! ( self , ErrorKind :: Io ( ref io_err) if io_err. kind( ) != std:: io:: ErrorKind :: TimedOut )
326
- }
327
-
328
- pub ( crate ) fn is_network_error ( & self ) -> bool {
329
- matches ! (
330
- self ,
331
- ErrorKind :: Io ( ..) | ErrorKind :: ConnectionPoolClearedError { .. }
332
- )
333
- }
334
-
335
- /// Gets the code from this error for performing SDAM updates, if applicable.
336
- /// Any codes contained in WriteErrors are ignored.
337
- pub ( crate ) fn code ( & self ) -> Option < i32 > {
338
- match self {
339
- ErrorKind :: CommandError ( command_error) => {
340
- Some ( command_error. code )
341
- } ,
342
- // According to SDAM spec, write concern error codes MUST also be checked, and writeError codes
343
- // MUST NOT be checked.
344
- ErrorKind :: BulkWriteError ( BulkWriteFailure { write_concern_error : Some ( wc_error) , .. } ) => {
345
- Some ( wc_error. code )
346
- }
347
- ErrorKind :: WriteError ( WriteFailure :: WriteConcernError ( wc_error) ) => Some ( wc_error. code ) ,
348
- _ => None
349
- }
350
- }
351
-
352
- /// Gets the server's message for this error, if applicable, for use in testing.
353
- /// If this error is a BulkWriteError, the messages are concatenated.
354
- #[ cfg( test) ]
355
- pub ( crate ) fn server_message ( & self ) -> Option < String > {
356
- match self {
357
- ErrorKind :: CommandError ( command_error) => {
358
- Some ( command_error. message . clone ( ) )
359
- } ,
360
- // since this is used primarily for errorMessageContains assertions in the unified runner, we just
361
- // concatenate all the relevant server messages into one for bulk errors.
362
- ErrorKind :: BulkWriteError ( BulkWriteFailure { write_concern_error, write_errors } ) => {
363
- let mut msg = "" . to_string ( ) ;
364
- if let Some ( wc_error) = write_concern_error {
365
- msg. push_str ( wc_error. message . as_str ( ) ) ;
366
- }
367
- if let Some ( write_errors) = write_errors {
368
- for we in write_errors {
369
- msg. push_str ( we. message . as_str ( ) ) ;
370
- }
371
- }
372
- Some ( msg)
373
- }
374
- ErrorKind :: WriteError ( WriteFailure :: WriteConcernError ( wc_error) ) => Some ( wc_error. message . clone ( ) ) ,
375
- ErrorKind :: WriteError ( WriteFailure :: WriteError ( write_error) ) => Some ( write_error. message . clone ( ) ) ,
376
- _ => None
377
- }
378
- }
379
-
380
- /// Gets the code name from this error, if applicable.
381
- #[ cfg( test) ]
382
- pub ( crate ) fn code_name ( & self ) -> Option < & str > {
383
- match self {
384
- ErrorKind :: CommandError ( ref cmd_err) => Some ( cmd_err. code_name . as_str ( ) ) ,
385
- ErrorKind :: WriteError ( ref failure) => match failure {
386
- WriteFailure :: WriteConcernError ( ref wce) => Some ( wce. code_name . as_str ( ) ) ,
387
- WriteFailure :: WriteError ( ref we) => we. code_name . as_deref ( ) ,
388
- } ,
389
- ErrorKind :: BulkWriteError ( ref bwe) => bwe
390
- . write_concern_error
391
- . as_ref ( )
392
- . map ( |wce| wce. code_name . as_str ( ) ) ,
393
- _ => None ,
394
- }
395
- }
396
-
397
- /// If this error corresponds to a "not master" error as per the SDAM spec.
398
- pub ( crate ) fn is_not_master ( & self ) -> bool {
399
- self . code ( ) . map ( |code| NOTMASTER_CODES . contains ( & code) ) . unwrap_or ( false )
400
- }
401
-
402
- /// If this error corresponds to a "node is recovering" error as per the SDAM spec.
403
- pub ( crate ) fn is_recovering ( & self ) -> bool {
404
- self . code ( )
405
- . map ( |code| RECOVERING_CODES . contains ( & code) )
406
- . unwrap_or ( false )
407
- }
408
-
409
- /// If this error corresponds to a "node is shutting down" error as per the SDAM spec.
410
- pub ( crate ) fn is_shutting_down ( & self ) -> bool {
411
- self . code ( )
412
- . map ( |code| SHUTTING_DOWN_CODES . contains ( & code) )
413
- . unwrap_or ( false )
414
- }
415
- }
416
407
417
408
/// An error that occurred due to a database command failing.
418
409
#[ derive( Clone , Debug , Deserialize ) ]
0 commit comments