🦀
Rust製コマンドで意味付けされた終了ステータスを返す
はじめに
Rustで<sysexits.h>
で定義されている終了ステータスを使えるようにするクレートを開発しているので紹介します。
<sysexits.h>
とは
<sysexits.h>
はBSD系に由来する定義付けされた終了ステータスです。
64
から78
までの終了ステータスの意味が定義されています。
sysexits
クレートについて
sysexits
は<sysexits.h>
で定義されている終了ステータスを使えるようにするクレートです。
Termination
トレイトを実装しているのでmain
関数の戻り値として利用できます。
<sysexits.h>
では終了ステータスは定数として定義されていますが、sysexits
クレートでは列挙型として定義しています。
メソッドとしては終了ステータスが成功を表すときにtrue
を返すExitCode::is_success
メソッド、失敗を表すときにtrue
を返すExitCode::is_failure
メソッド、指定した終了ステータスでプロセスを終了するExitCode::exit
メソッドを実装しています。
is_success.rs
assert_eq!(ExitCode::Ok.is_success(), true);
assert_eq!(ExitCode::Usage.is_success(), false);
is_failure.rs
assert_eq!(ExitCode::Ok.is_failure(), false);
assert_eq!(ExitCode::Usage.is_failure(), true);
exit.rs
fn main() {
ExitCode::Ok.exit();
}
また、From
による終了ステータスのプリミティブ整数型への変換、io::Error
などからの終了ステータスへの変換を実装しています。
使い方
前述の通り、sysexits
クレートはTermination
トレイトを実装しているのでmain
関数の戻り値として利用できます。
main.rs
use std::str;
use sysexits::ExitCode;
fn main() -> ExitCode {
let bytes = [0xf0, 0x9f, 0x92, 0x96];
match str::from_utf8(&bytes) {
Ok(string) => {
println!("{string}");
ExitCode::Ok
}
Err(err) => {
eprintln!("{err}");
ExitCode::DataErr
}
}
}
<sysexits.h>
で定義されていない終了ステータスも返したいときは、sysexits::ExitCode
をstd::process::ExitCode
に変換します。
終わりに
Rustで<sysexits.h>
で定義されている終了ステータスを使えるようにするsysexits
クレートを紹介しました。
詳しい使い方については以下を参照して下さい。
Discussion