From f2a56f422257b7239b6aec475ec749ca9b75c765 Mon Sep 17 00:00:00 2001 From: Scott McMurray Date: Wed, 19 May 2021 08:21:46 -0700 Subject: [PATCH] Fix 'Try' 'impl FromResidual for Outcome'. --- core/lib/src/outcome.rs | 44 +++++++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/core/lib/src/outcome.rs b/core/lib/src/outcome.rs index 171c1860..bce210b0 100644 --- a/core/lib/src/outcome.rs +++ b/core/lib/src/outcome.rs @@ -603,11 +603,10 @@ impl Outcome { } } -impl, F> FromResidual> for Outcome { - fn from_residual(r: Result) -> Self { - #[allow(unreachable_code)] +impl, F> FromResidual> for Outcome { + fn from_residual(r: Result) -> Self { match r { - Ok(v) => Outcome::Success(v), + Ok(never) => match never {}, Err(y) => Outcome::Failure(y.into()), } } @@ -615,9 +614,8 @@ impl, F> FromResidual> for Outcome { impl, Y, F: From> FromResidual> for Outcome { fn from_residual(r: Outcome) -> Self { - #[allow(unreachable_code)] match r { - Outcome::Success(s) => Outcome::Success(s), + Outcome::Success(never) => match never {}, Outcome::Failure(x) => Outcome::Failure(x.into()), Outcome::Forward(y) => Outcome::Forward(y.into()), } @@ -654,3 +652,37 @@ impl fmt::Display for Outcome { write!(f, "{}", Paint::default(string).fg(color)) } } + +#[cfg(test)] +mod test { + use super::Outcome::{self, *}; + + macro_rules! fake_try { + ($e:block) => { + (||{ + std::ops::Try::from_output($e) + })() + } + } + + #[test] + fn outcome_try_trait() { + let r: Outcome = fake_try! {{ 3 }}; + assert_eq!(r, Success(3)); + let r: Outcome = fake_try! {{ Success::<_, &'static str, f32>(3)? }}; + assert_eq!(r, Success(3)); + let r: Outcome = fake_try! {{ Failure::("oops")?; 7 }}; + assert_eq!(r, Failure(String::from("oops"))); + let r: Outcome = fake_try! {{ Forward::(1234.5_f32)?; 7 }}; + assert_eq!(r, Forward(1234.5)); + } + + #[test] + fn can_use_question_mark_on_result_in_function_returning_outcome() { + fn demo() -> Outcome { + Err("problem")?; + unreachable!() + } + assert_eq!(demo(), Failure(String::from("problem"))); + } +}