Custom exit status codes with ? in main
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.
examples update readme Feb 9, 2019
src initial commit Feb 9, 2019
Cargo.toml update cargo package settings Feb 16, 2019
LICENSE-APACHE.txt readme and license Feb 9, 2019
LICENSE-MIT.txt readme and license Feb 9, 2019 add crates io badge to readme Feb 16, 2019
rust-toolchain initial commit Feb 9, 2019

exit badge

This crate exposes a type, Exit, which allows using ? in main while also specifying custom exit status codes.

The goal of this crate was to provide a proof of concept and sample implementation for the ideas discussed in this blog post.


use exit::Exit;

use std::env;
use std::option;

enum MyErr {

impl From<MyErr> for i32 {
    fn from(err: MyErr) -> Self {
        match err {
            MyErr::MissingArg => 2,
            MyErr::ParseErrorUserNum => 3,
            MyErr::ParseErrorGroupNum => 4,

impl From<option::NoneError> for MyErr {
    fn from(_: option::NoneError) -> Self {

fn main() -> Exit<MyErr> {
    let user_num_string : String = env::args().skip(1).next()?;
    let group_num_string : String = env::args().skip(2).next()?;

    let user_num : u32 = user_num_string.parse()
        .map_err(|_| MyErr::ParseErrorUserNum)?;
    let group_num : u32 = group_num_string.parse()
        .map_err(|_| MyErr::ParseErrorGroupNum)?;

    println!("Hello, user #{} from group #{}!", user_num, group_num);



Licensed under either of

at your option.


Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.