Skip to content

Instantly share code, notes, and snippets.

@U007D
Last active May 15, 2017 18:38
Show Gist options
  • Save U007D/a49797cb92cdee60ea9b70e4c3d4aae7 to your computer and use it in GitHub Desktop.
Save U007D/a49797cb92cdee60ea9b70e4c3d4aae7 to your computer and use it in GitHub Desktop.
Multi-branch early-return code examples
#![allow(unused_variables, dead_code)]
use std::fmt;
use std::error::Error;
fn main()
{
match do_work()
{
Ok(v) => assert!(v == 4),
Err(e) => println!("Error: {}", e.description()),
}
}
fn do_work() -> Result<i32, MultiStageError>
{
Ok(foo4(foo1()?, foo2()?, foo3()?)?)
}
fn foo1() -> Result<i32, MultiStageError> { Ok(1) }
fn foo2() -> Result<i32, MultiStageError> { Ok(2) }
fn foo3() -> Result<i32, MultiStageError> { Ok(3) }
fn foo4(a: i32, b: i32, c: i32) -> Result<i32, MultiStageError> { Ok(4) }
// ****************************************************************************
// Below is the impementation for the custom error types to make the above run
// ****************************************************************************
#[derive(Debug, PartialEq, Eq)]
enum MultiStageError
{
Stage1,
Stage2,
Stage3,
Stage4,
}
impl std::error::Error for MultiStageError
{
fn description(&self) -> &str
{
match *self
{
MultiStageError::Stage1 => "Stage 1 error",
MultiStageError::Stage2 => "Stage 2 error",
MultiStageError::Stage3 => "Stage 3 error",
MultiStageError::Stage4 => "Stage 4 error",
}
}
fn cause(&self) -> Option<&std::error::Error> { None }
}
impl fmt::Display for MultiStageError
{
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error>
{
match *self
{
MultiStageError::Stage1 => write!(f, "{}", "Stage 1 error"),
MultiStageError::Stage2 => write!(f, "{}", "Stage 2 error"),
MultiStageError::Stage3 => write!(f, "{}", "Stage 3 error"),
MultiStageError::Stage4 => write!(f, "{}", "Stage 4 error"),
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment