🦀
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