1
1
use core:: option:: * ;
2
+ use core:: array:: FixedSizeArray ;
3
+ use core:: ops:: DerefMut ;
2
4
3
5
fn op1 ( ) -> Result < isize , & ' static str > { Ok ( 666 ) }
4
6
fn op2 ( ) -> Result < isize , & ' static str > { Err ( "sadface" ) }
@@ -237,7 +239,7 @@ fn test_result_as_deref() {
237
239
assert_eq ! ( ref_ok. as_deref_ok( ) , expected_result) ;
238
240
239
241
let ref_ok = & Result :: Ok :: < Vec < i32 > , u32 > ( vec ! [ 1 , 2 , 3 , 4 , 5 ] ) ;
240
- let expected_result = Result :: Ok :: < & [ i32 ] , & u32 > ( & [ 1 , 2 , 3 , 4 , 5 ] [ .. ] ) ;
242
+ let expected_result = Result :: Ok :: < & [ i32 ] , & u32 > ( [ 1 , 2 , 3 , 4 , 5 ] . as_slice ( ) ) ;
241
243
assert_eq ! ( ref_ok. as_deref_ok( ) , expected_result) ;
242
244
243
245
// &Result<T: Deref, E: Deref>::Ok(T).as_deref() ->
@@ -251,7 +253,7 @@ fn test_result_as_deref() {
251
253
assert_eq ! ( ref_ok. as_deref( ) , expected_result) ;
252
254
253
255
let ref_ok = & Result :: Ok :: < Vec < i32 > , & u32 > ( vec ! [ 1 , 2 , 3 , 4 , 5 ] ) ;
254
- let expected_result = Result :: Ok :: < & [ i32 ] , & u32 > ( & [ 1 , 2 , 3 , 4 , 5 ] [ .. ] ) ;
256
+ let expected_result = Result :: Ok :: < & [ i32 ] , & u32 > ( [ 1 , 2 , 3 , 4 , 5 ] . as_slice ( ) ) ;
255
257
assert_eq ! ( ref_ok. as_deref( ) , expected_result) ;
256
258
257
259
// &Result<T, E: Deref>::Err(T).as_deref_err() ->
@@ -265,7 +267,7 @@ fn test_result_as_deref() {
265
267
assert_eq ! ( ref_err. as_deref_err( ) , expected_result) ;
266
268
267
269
let ref_err = & Result :: Err :: < u32 , Vec < i32 > > ( vec ! [ 5 , 4 , 3 , 2 , 1 ] ) ;
268
- let expected_result = Result :: Err :: < & u32 , & [ i32 ] > ( & [ 5 , 4 , 3 , 2 , 1 ] [ .. ] ) ;
270
+ let expected_result = Result :: Err :: < & u32 , & [ i32 ] > ( [ 5 , 4 , 3 , 2 , 1 ] . as_slice ( ) ) ;
269
271
assert_eq ! ( ref_err. as_deref_err( ) , expected_result) ;
270
272
271
273
// &Result<T: Deref, E: Deref>::Err(T).as_deref_err() ->
@@ -279,7 +281,7 @@ fn test_result_as_deref() {
279
281
assert_eq ! ( ref_err. as_deref( ) , expected_result) ;
280
282
281
283
let ref_err = & Result :: Err :: < & u32 , Vec < i32 > > ( vec ! [ 5 , 4 , 3 , 2 , 1 ] ) ;
282
- let expected_result = Result :: Err :: < & u32 , & [ i32 ] > ( & [ 5 , 4 , 3 , 2 , 1 ] [ .. ] ) ;
284
+ let expected_result = Result :: Err :: < & u32 , & [ i32 ] > ( [ 5 , 4 , 3 , 2 , 1 ] . as_slice ( ) ) ;
283
285
assert_eq ! ( ref_err. as_deref( ) , expected_result) ;
284
286
285
287
// The following cases test calling `as_deref_*` with the wrong variant (i.e.
@@ -316,3 +318,122 @@ fn test_result_as_deref() {
316
318
let expected_result = Result :: Err :: < & u32 , & [ i32 ; 5 ] > ( & [ 5 , 4 , 3 , 2 , 1 ] ) ;
317
319
assert_eq ! ( ref_err. as_deref_ok( ) , expected_result) ;
318
320
}
321
+
322
+ #[ test]
323
+ fn test_result_as_deref_mut ( ) {
324
+ // &mut Result<T: Deref, E>::Ok(T).as_deref_mut_ok() ->
325
+ // Result<&mut T::Deref::Target, &mut E>::Ok(&mut *T)
326
+ let mut val = 42 ;
327
+ let mut expected_val = 42 ;
328
+ let mut_ok = & mut Result :: Ok :: < & mut i32 , u8 > ( & mut val) ;
329
+ let expected_result = Result :: Ok :: < & mut i32 , & mut u8 > ( & mut expected_val) ;
330
+ assert_eq ! ( mut_ok. as_deref_mut_ok( ) , expected_result) ;
331
+
332
+ let mut expected_string = String :: from ( "a result" ) ;
333
+ let mut_ok = & mut Result :: Ok :: < String , u32 > ( expected_string. clone ( ) ) ;
334
+ let expected_result = Result :: Ok :: < & mut str , & mut u32 > ( expected_string. deref_mut ( ) ) ;
335
+ assert_eq ! ( mut_ok. as_deref_mut_ok( ) , expected_result) ;
336
+
337
+ let mut expected_vec = vec ! [ 1 , 2 , 3 , 4 , 5 ] ;
338
+ let mut_ok = & mut Result :: Ok :: < Vec < i32 > , u32 > ( expected_vec. clone ( ) ) ;
339
+ let expected_result = Result :: Ok :: < & mut [ i32 ] , & mut u32 > ( expected_vec. as_mut_slice ( ) ) ;
340
+ assert_eq ! ( mut_ok. as_deref_mut_ok( ) , expected_result) ;
341
+
342
+ // &mut Result<T: Deref, E: Deref>::Ok(T).as_deref_mut() ->
343
+ // Result<&mut T::Deref::Target, &mut E::Deref::Target>::Ok(&mut *T)
344
+ let mut val = 42 ;
345
+ let mut expected_val = 42 ;
346
+ let mut_ok = & mut Result :: Ok :: < & mut i32 , & mut u8 > ( & mut val) ;
347
+ let expected_result = Result :: Ok :: < & mut i32 , & mut u8 > ( & mut expected_val) ;
348
+ assert_eq ! ( mut_ok. as_deref_mut( ) , expected_result) ;
349
+
350
+ let mut expected_string = String :: from ( "a result" ) ;
351
+ let mut_ok = & mut Result :: Ok :: < String , & mut u32 > ( expected_string. clone ( ) ) ;
352
+ let expected_result = Result :: Ok :: < & mut str , & mut u32 > ( expected_string. deref_mut ( ) ) ;
353
+ assert_eq ! ( mut_ok. as_deref_mut( ) , expected_result) ;
354
+
355
+ let mut expected_vec = vec ! [ 1 , 2 , 3 , 4 , 5 ] ;
356
+ let mut_ok = & mut Result :: Ok :: < Vec < i32 > , & mut u32 > ( expected_vec. clone ( ) ) ;
357
+ let expected_result = Result :: Ok :: < & mut [ i32 ] , & mut u32 > ( expected_vec. as_mut_slice ( ) ) ;
358
+ assert_eq ! ( mut_ok. as_deref_mut( ) , expected_result) ;
359
+
360
+ // &mut Result<T, E: Deref>::Err(T).as_deref_mut_err() ->
361
+ // Result<&mut T, &mut E::Deref::Target>::Err(&mut *E)
362
+ let mut val = 41 ;
363
+ let mut expected_val = 41 ;
364
+ let mut_err = & mut Result :: Err :: < u8 , & mut i32 > ( & mut val) ;
365
+ let expected_result = Result :: Err :: < & mut u8 , & mut i32 > ( & mut expected_val) ;
366
+ assert_eq ! ( mut_err. as_deref_mut_err( ) , expected_result) ;
367
+
368
+ let mut expected_string = String :: from ( "an error" ) ;
369
+ let mut_err = & mut Result :: Err :: < u32 , String > ( expected_string. clone ( ) ) ;
370
+ let expected_result = Result :: Err :: < & mut u32 , & mut str > ( expected_string. deref_mut ( ) ) ;
371
+ assert_eq ! ( mut_err. as_deref_mut_err( ) , expected_result) ;
372
+
373
+ let mut expected_vec = vec ! [ 5 , 4 , 3 , 2 , 1 ] ;
374
+ let mut_err = & mut Result :: Err :: < u32 , Vec < i32 > > ( expected_vec. clone ( ) ) ;
375
+ let expected_result = Result :: Err :: < & mut u32 , & mut [ i32 ] > ( expected_vec. as_mut_slice ( ) ) ;
376
+ assert_eq ! ( mut_err. as_deref_mut_err( ) , expected_result) ;
377
+
378
+ // &mut Result<T: Deref, E: Deref>::Err(T).as_deref_mut_err() ->
379
+ // Result<&mut T, &mut E::Deref::Target>::Err(&mut *E)
380
+ let mut val = 41 ;
381
+ let mut expected_val = 41 ;
382
+ let mut_err = & mut Result :: Err :: < & mut u8 , & mut i32 > ( & mut val) ;
383
+ let expected_result = Result :: Err :: < & mut u8 , & mut i32 > ( & mut expected_val) ;
384
+ assert_eq ! ( mut_err. as_deref_mut( ) , expected_result) ;
385
+
386
+ let mut expected_string = String :: from ( "an error" ) ;
387
+ let mut_err = & mut Result :: Err :: < & mut u32 , String > ( expected_string. clone ( ) ) ;
388
+ let expected_result = Result :: Err :: < & mut u32 , & mut str > ( expected_string. as_mut_str ( ) ) ;
389
+ assert_eq ! ( mut_err. as_deref_mut( ) , expected_result) ;
390
+
391
+ let mut expected_vec = vec ! [ 5 , 4 , 3 , 2 , 1 ] ;
392
+ let mut_err = & mut Result :: Err :: < & mut u32 , Vec < i32 > > ( expected_vec. clone ( ) ) ;
393
+ let expected_result = Result :: Err :: < & mut u32 , & mut [ i32 ] > ( expected_vec. as_mut_slice ( ) ) ;
394
+ assert_eq ! ( mut_err. as_deref_mut( ) , expected_result) ;
395
+
396
+ // The following cases test calling `as_deref_mut_*` with the wrong variant (i.e.
397
+ // `as_deref_mut_ok()` with a `Result::Err()`, or `as_deref_mut_err()` with a `Result::Ok()`.
398
+ // While uncommon, these cases are supported to ensure that an `as_deref_mut_*`
399
+ // call can still be made even when one of the Result types does not implement
400
+ // `Deref` (for example, std::io::Error).
401
+
402
+ // &mut Result<T, E: Deref>::Ok(T).as_deref_mut_err() ->
403
+ // Result<&mut T, &mut E::Deref::Target>::Ok(&mut T)
404
+ let mut expected_val = 42 ;
405
+ let mut_ok = & mut Result :: Ok :: < i32 , & mut u8 > ( expected_val. clone ( ) ) ;
406
+ let expected_result = Result :: Ok :: < & mut i32 , & mut u8 > ( & mut expected_val) ;
407
+ assert_eq ! ( mut_ok. as_deref_mut_err( ) , expected_result) ;
408
+
409
+ let string = String :: from ( "a result" ) ;
410
+ let expected_string = string. clone ( ) ;
411
+ let mut ref_str = expected_string. as_ref ( ) ;
412
+ let mut_ok = & mut Result :: Ok :: < & str , & mut u32 > ( string. as_str ( ) ) ;
413
+ let expected_result = Result :: Ok :: < & mut & str , & mut u32 > ( & mut ref_str) ;
414
+ assert_eq ! ( mut_ok. as_deref_mut_err( ) , expected_result) ;
415
+
416
+ let mut expected_arr = [ 1 , 2 , 3 , 4 , 5 ] ;
417
+ let mut_ok = & mut Result :: Ok :: < [ i32 ; 5 ] , & mut u32 > ( expected_arr. clone ( ) ) ;
418
+ let expected_result = Result :: Ok :: < & mut [ i32 ; 5 ] , & mut u32 > ( & mut expected_arr) ;
419
+ assert_eq ! ( mut_ok. as_deref_mut_err( ) , expected_result) ;
420
+
421
+ // &mut Result<T: Deref, E>::Err(E).as_deref_mut_ok() ->
422
+ // Result<&mut T::Deref::Target, &mut E>::Err(&mut E)
423
+ let mut expected_val = 41 ;
424
+ let mut_err = & mut Result :: Err :: < & mut u8 , i32 > ( expected_val. clone ( ) ) ;
425
+ let expected_result = Result :: Err :: < & mut u8 , & mut i32 > ( & mut expected_val) ;
426
+ assert_eq ! ( mut_err. as_deref_mut_ok( ) , expected_result) ;
427
+
428
+ let string = String :: from ( "an error" ) ;
429
+ let expected_string = string. clone ( ) ;
430
+ let mut ref_str = expected_string. as_ref ( ) ;
431
+ let mut_err = & mut Result :: Err :: < & mut u32 , & str > ( string. as_str ( ) ) ;
432
+ let expected_result = Result :: Err :: < & mut u32 , & mut & str > ( & mut ref_str) ;
433
+ assert_eq ! ( mut_err. as_deref_mut_ok( ) , expected_result) ;
434
+
435
+ let mut expected_arr = [ 5 , 4 , 3 , 2 , 1 ] ;
436
+ let mut_err = & mut Result :: Err :: < & mut u32 , [ i32 ; 5 ] > ( expected_arr. clone ( ) ) ;
437
+ let expected_result = Result :: Err :: < & mut u32 , & mut [ i32 ; 5 ] > ( & mut expected_arr) ;
438
+ assert_eq ! ( mut_err. as_deref_mut_ok( ) , expected_result) ;
439
+ }
0 commit comments