Crates.io | exit |
lib.rs | exit |
version | 0.2.0 |
source | src |
created_at | 2019-02-16 00:17:34.871229 |
updated_at | 2019-06-17 01:50:59.460958 |
description | Custom exit status codes with ? in main |
homepage | |
repository | https://github.com/JoshMcguigan/exit |
max_upload_size | |
id | 115060 |
size | 18,630 |
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.
#![feature(try_trait)]
use exit::{Exit, ExitDisplay};
use std::env;
use std::option;
#[derive(Debug)]
enum MyErr {
MissingArg,
ParseErrorUserNum,
ParseErrorGroupNum,
}
impl From<MyErr> for i32 {
fn from(err: MyErr) -> Self {
match err {
MyErr::MissingArg => 2,
MyErr::ParseErrorUserNum => 3,
MyErr::ParseErrorGroupNum => 4,
}
}
}
// You can optionally implement ExitDisplay for your error type in order to print an error message
// on exit
impl ExitDisplay for MyErr {
fn display(&self) -> String {
format!("{:?}", self)
}
}
impl From<option::NoneError> for MyErr {
fn from(_: option::NoneError) -> Self {
MyErr::MissingArg
}
}
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);
Exit::Ok
}
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.