Skip to content

libstd: Add unwrap_or and unwrap_or_handle to Result #13475

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 14, 2014
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 61 additions & 0 deletions src/libstd/result.rs
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,26 @@ impl<T, E> Result<T, E> {
}
}

/// 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]
Expand Down Expand Up @@ -389,4 +409,45 @@ mod tests {
assert_eq!(format!("{}", ok), ~"Ok(100)");
assert_eq!(format!("{}", err), ~"Err(Err)");
}

#[test]
pub fn test_unwrap_or() {
let ok: Result<int, ~str> = Ok(100);
let ok_err: Result<int, ~str> = 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<int, ~str> = Ok(100);
let ok_err: Result<int, ~str> = 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<int, ~str> = Err(~"Unrecoverable mess.");
let _ : int = bad_err.unwrap_or_handle(handler);
}
}