@@ -233,3 +233,96 @@ fn test_try() {
233233 }
234234 assert_eq ! ( try_result_err( ) , Err ( 1 ) ) ;
235235}
236+
237+ #[ test]
238+ fn test_result_deref ( ) {
239+ // &Result<T: Deref, E>::Ok(T).deref_ok() ->
240+ // Result<&T::Deref::Target, &E>::Ok(&*T)
241+ let ref_ok = & Result :: Ok :: < & i32 , u8 > ( & 42 ) ;
242+ let expected_result = Result :: Ok :: < & i32 , & u8 > ( & 42 ) ;
243+ assert_eq ! ( ref_ok. deref_ok( ) , expected_result) ;
244+
245+ let ref_ok = & Result :: Ok :: < String , u32 > ( String :: from ( "a result" ) ) ;
246+ let expected_result = Result :: Ok :: < & str , & u32 > ( "a result" ) ;
247+ assert_eq ! ( ref_ok. deref_ok( ) , expected_result) ;
248+
249+ let ref_ok = & Result :: Ok :: < Vec < i32 > , u32 > ( vec ! [ 1 , 2 , 3 , 4 , 5 ] ) ;
250+ let expected_result = Result :: Ok :: < & [ i32 ] , & u32 > ( & [ 1 , 2 , 3 , 4 , 5 ] [ ..] ) ;
251+ assert_eq ! ( ref_ok. deref_ok( ) , expected_result) ;
252+
253+ // &Result<T: Deref, E: Deref>::Ok(T).deref() ->
254+ // Result<&T::Deref::Target, &E::Deref::Target>::Ok(&*T)
255+ let ref_ok = & Result :: Ok :: < & i32 , & u8 > ( & 42 ) ;
256+ let expected_result = Result :: Ok :: < & i32 , & u8 > ( & 42 ) ;
257+ assert_eq ! ( ref_ok. deref( ) , expected_result) ;
258+
259+ let ref_ok = & Result :: Ok :: < String , & u32 > ( String :: from ( "a result" ) ) ;
260+ let expected_result = Result :: Ok :: < & str , & u32 > ( "a result" ) ;
261+ assert_eq ! ( ref_ok. deref( ) , expected_result) ;
262+
263+ let ref_ok = & Result :: Ok :: < Vec < i32 > , & u32 > ( vec ! [ 1 , 2 , 3 , 4 , 5 ] ) ;
264+ let expected_result = Result :: Ok :: < & [ i32 ] , & u32 > ( & [ 1 , 2 , 3 , 4 , 5 ] [ ..] ) ;
265+ assert_eq ! ( ref_ok. deref( ) , expected_result) ;
266+
267+ // &Result<T, E: Deref>::Err(T).deref_err() ->
268+ // Result<&T, &E::Deref::Target>::Err(&*E)
269+ let ref_err = & Result :: Err :: < u8 , & i32 > ( & 41 ) ;
270+ let expected_result = Result :: Err :: < & u8 , & i32 > ( & 41 ) ;
271+ assert_eq ! ( ref_err. deref_err( ) , expected_result) ;
272+
273+ let ref_err = & Result :: Err :: < u32 , String > ( String :: from ( "an error" ) ) ;
274+ let expected_result = Result :: Err :: < & u32 , & str > ( "an error" ) ;
275+ assert_eq ! ( ref_err. deref_err( ) , expected_result) ;
276+
277+ let ref_err = & Result :: Err :: < u32 , Vec < i32 > > ( vec ! [ 5 , 4 , 3 , 2 , 1 ] ) ;
278+ let expected_result = Result :: Err :: < & u32 , & [ i32 ] > ( & [ 5 , 4 , 3 , 2 , 1 ] [ ..] ) ;
279+ assert_eq ! ( ref_err. deref_err( ) , expected_result) ;
280+
281+ // &Result<T: Deref, E: Deref>::Err(T).deref_err() ->
282+ // Result<&T, &E::Deref::Target>::Err(&*E)
283+ let ref_err = & Result :: Err :: < & u8 , & i32 > ( & 41 ) ;
284+ let expected_result = Result :: Err :: < & u8 , & i32 > ( & 41 ) ;
285+ assert_eq ! ( ref_err. deref( ) , expected_result) ;
286+
287+ let ref_err = & Result :: Err :: < & u32 , String > ( String :: from ( "an error" ) ) ;
288+ let expected_result = Result :: Err :: < & u32 , & str > ( "an error" ) ;
289+ assert_eq ! ( ref_err. deref( ) , expected_result) ;
290+
291+ let ref_err = & Result :: Err :: < & u32 , Vec < i32 > > ( vec ! [ 5 , 4 , 3 , 2 , 1 ] ) ;
292+ let expected_result = Result :: Err :: < & u32 , & [ i32 ] > ( & [ 5 , 4 , 3 , 2 , 1 ] [ ..] ) ;
293+ assert_eq ! ( ref_err. deref( ) , expected_result) ;
294+
295+ // The following cases test calling deref_* with the wrong variant (i.e.
296+ // `deref_ok()` with a `Result::Err()`, or `deref_err()` with a `Result::Ok()`.
297+ // While unusual, these cases are supported to ensure that an `inner_deref`
298+ // call can still be made even when one of the Result types does not implement
299+ // `Deref` (for example, std::io::Error).
300+
301+ // &Result<T, E: Deref>::Ok(T).deref_err() ->
302+ // Result<&T, &E::Deref::Target>::Ok(&T)
303+ let ref_ok = & Result :: Ok :: < i32 , & u8 > ( 42 ) ;
304+ let expected_result = Result :: Ok :: < & i32 , & u8 > ( & 42 ) ;
305+ assert_eq ! ( ref_ok. deref_err( ) , expected_result) ;
306+
307+ let ref_ok = & Result :: Ok :: < & str , & u32 > ( "a result" ) ;
308+ let expected_result = Result :: Ok :: < & & str , & u32 > ( & "a result" ) ;
309+ assert_eq ! ( ref_ok. deref_err( ) , expected_result) ;
310+
311+ let ref_ok = & Result :: Ok :: < [ i32 ; 5 ] , & u32 > ( [ 1 , 2 , 3 , 4 , 5 ] ) ;
312+ let expected_result = Result :: Ok :: < & [ i32 ; 5 ] , & u32 > ( & [ 1 , 2 , 3 , 4 , 5 ] ) ;
313+ assert_eq ! ( ref_ok. deref_err( ) , expected_result) ;
314+
315+ // &Result<T: Deref, E>::Err(E).deref_ok() ->
316+ // Result<&T::Deref::Target, &E>::Err(&E)
317+ let ref_err = & Result :: Err :: < & u8 , i32 > ( 41 ) ;
318+ let expected_result = Result :: Err :: < & u8 , & i32 > ( & 41 ) ;
319+ assert_eq ! ( ref_err. deref_ok( ) , expected_result) ;
320+
321+ let ref_err = & Result :: Err :: < & u32 , & str > ( "an error" ) ;
322+ let expected_result = Result :: Err :: < & u32 , & & str > ( & "an error" ) ;
323+ assert_eq ! ( ref_err. deref_ok( ) , expected_result) ;
324+
325+ let ref_err = & Result :: Err :: < & u32 , [ i32 ; 5 ] > ( [ 5 , 4 , 3 , 2 , 1 ] ) ;
326+ let expected_result = Result :: Err :: < & u32 , & [ i32 ; 5 ] > ( & [ 5 , 4 , 3 , 2 , 1 ] ) ;
327+ assert_eq ! ( ref_err. deref_ok( ) , expected_result) ;
328+ }
0 commit comments