11use core:: option:: * ;
2+ use core:: array:: FixedSizeArray ;
3+ use core:: ops:: DerefMut ;
24
35fn op1 ( ) -> Result < isize , & ' static str > { Ok ( 666 ) }
46fn op2 ( ) -> Result < isize , & ' static str > { Err ( "sadface" ) }
@@ -237,7 +239,7 @@ fn test_result_as_deref() {
237239 assert_eq ! ( ref_ok. as_deref_ok( ) , expected_result) ;
238240
239241 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 ( ) ) ;
241243 assert_eq ! ( ref_ok. as_deref_ok( ) , expected_result) ;
242244
243245 // &Result<T: Deref, E: Deref>::Ok(T).as_deref() ->
@@ -251,7 +253,7 @@ fn test_result_as_deref() {
251253 assert_eq ! ( ref_ok. as_deref( ) , expected_result) ;
252254
253255 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 ( ) ) ;
255257 assert_eq ! ( ref_ok. as_deref( ) , expected_result) ;
256258
257259 // &Result<T, E: Deref>::Err(T).as_deref_err() ->
@@ -265,7 +267,7 @@ fn test_result_as_deref() {
265267 assert_eq ! ( ref_err. as_deref_err( ) , expected_result) ;
266268
267269 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 ( ) ) ;
269271 assert_eq ! ( ref_err. as_deref_err( ) , expected_result) ;
270272
271273 // &Result<T: Deref, E: Deref>::Err(T).as_deref_err() ->
@@ -279,7 +281,7 @@ fn test_result_as_deref() {
279281 assert_eq ! ( ref_err. as_deref( ) , expected_result) ;
280282
281283 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 ( ) ) ;
283285 assert_eq ! ( ref_err. as_deref( ) , expected_result) ;
284286
285287 // The following cases test calling `as_deref_*` with the wrong variant (i.e.
@@ -316,3 +318,122 @@ fn test_result_as_deref() {
316318 let expected_result = Result :: Err :: < & u32 , & [ i32 ; 5 ] > ( & [ 5 , 4 , 3 , 2 , 1 ] ) ;
317319 assert_eq ! ( ref_err. as_deref_ok( ) , expected_result) ;
318320}
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