シグナルでプロセスが終了されるとぴえんするコマンド作った

最近YouTubeでPIENのプレイ動画をよく見るので作りました

pienの後に渡したプログラムがシグナルで死んだ場合はぴえんの歌が再生されます github.com

なんとなくRustの勉強も兼ねてRustで書いてます。

地味にbrewでもダウンロードできるようになってます。

$ brew tap anatofuz/pien
$ brew install anatofuz/pien

別途音源が必要なので音源配布サイトからダウンロードして、ホームディレクトリに.pien.mp3で置いておくと再生されます。

soundevotee.net

実装方法

音声を流すのはafplayを雑に叩くみたいな世界観です。そぼく.....

RustでのCLIの作り方は全然解ってなかったので、いいかんじのチュートリアルを読みながら勉強しました。

rust-cli.github.io

肝なのは外部コマンドの終了コードの取得ですね。 Rustの場合は外部コマンドの終了コードはいい感じにパターンマッチで取得できます。

doc.rust-lang.org

use std::process::Command;

let status = Command::new("mkdir")
                     .arg("projects")
                     .status()
                     .expect("failed to execute mkdir");

match status.code() {
    Some(code) => println!("Exited with status code: {}", code),
    None       => println!("Process terminated by signal")
}

この例だとNoneに分類されるやつらが全員シグナルで死んでるので、Noneの場合は音楽を再生すれば良いということになります。その為今回は入力で受け取ったコマンドの結果をパターンマッチし、シグナルで死んでたらafplayを実行するみたいな極めて単純な実装になってます。

こういう一発ネタみたいなコマンド作るのやはり楽しいですね。