From a16eae6ffd923df5b349f55b75caf5af2aa5378d Mon Sep 17 00:00:00 2001 From: Kevin Butler Date: Sat, 12 Apr 2014 03:18:02 +0100 Subject: [PATCH] libstd: Add unwrap_or and unwrap_or_handle to Result --- src/libstd/result.rs | 61 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/src/libstd/result.rs b/src/libstd/result.rs index fa16b6f6eeb..8bd36127db2 100644 --- a/src/libstd/result.rs +++ b/src/libstd/result.rs @@ -188,6 +188,26 @@ pub fn unwrap(self) -> T { } } + /// Unwraps a result, yielding the content of an `Ok`. + /// Else it returns `optb`. + #[inline] + pub fn unwrap_or(self, optb: T) -> T { + match self { + Ok(t) => t, + Err(_) => optb + } + } + + /// Unwraps a result, yielding the content of an `Ok`. + /// If the value is an `Err` then it calls `op` with its value. + #[inline] + pub fn unwrap_or_handle(self, op: |E| -> T) -> T { + match self { + Ok(t) => t, + Err(e) => op(e) + } + } + /// Unwraps a result, yielding the content of an `Err`. /// Fails if the value is an `Ok`. #[inline] @@ -389,4 +409,45 @@ pub fn test_fmt_default() { assert_eq!(format!("{}", ok), ~"Ok(100)"); assert_eq!(format!("{}", err), ~"Err(Err)"); } + + #[test] + pub fn test_unwrap_or() { + let ok: Result = Ok(100); + let ok_err: Result = Err(~"Err"); + + assert_eq!(ok.unwrap_or(50), 100); + assert_eq!(ok_err.unwrap_or(50), 50); + } + + #[test] + pub fn test_unwrap_or_else() { + fn handler(msg: ~str) -> int { + if msg == ~"I got this." { + 50 + } else { + fail!("BadBad") + } + } + + let ok: Result = Ok(100); + let ok_err: Result = Err(~"I got this."); + + assert_eq!(ok.unwrap_or_handle(handler), 100); + assert_eq!(ok_err.unwrap_or_handle(handler), 50); + } + + #[test] + #[should_fail] + pub fn test_unwrap_or_else_failure() { + fn handler(msg: ~str) -> int { + if msg == ~"I got this." { + 50 + } else { + fail!("BadBad") + } + } + + let bad_err: Result = Err(~"Unrecoverable mess."); + let _ : int = bad_err.unwrap_or_handle(handler); + } } -- GitLab