Rustで薄いCLIフレームワーク作った
現在GitHub APIから統計情報を取得して表示するCLIツールgstatsを開発している。gstatsのインターフェースやhelpなどのCLIツールとして比較的よく使う部分をライブラリとして切り離して、CLIツール開発で必要最小限の機能を提供するCLIフレームワークseahorseを開発した。
CUIベースのTwitterクライアントtoyotterの開発で使ったurfave/cliに影響を受けている部分が大きいと思う。
使い方は非常に簡単で以下のようになる
use std::env;
use seahorse::{App, Action, Command, color};
fn main() {
let args: Vec<String> = env::args().collect();
// アプリケーションの表示名
let display_name = color::magenta("
██████╗██╗ ██╗
██╔════╝██║ ██║
██║ ██║ ██║
██║ ██║ ██║
╚██████╗███████╗██║
╚═════╝╚══════╝╚═╝");
// アクション(v: Vec<String>を引数とした関数)
let action: Action = |v: Vec<String>| println!("Hello, {:?}", v);
// コマンド
let command = Command::new("hello", "cli_tool hello user", action);
let app = App::new()
.name("cli_tool")
.display_name(display_name)
.usage("cli_tool [command] [arg]")
.version(env!("CARGO_PKG_VERSION"))
.commands(vec![command]);
app.run(args);
}
実行結果は以下のようになる
$ ./target/cli_tool
Name:
██████╗██╗ ██╗
██╔════╝██║ ██║
██║ ██║ ██║
██║ ██║ ██║
╚██████╗███████╗██║
╚═════╝╚══════╝╚═╝
Usage:
cli_tool [command] [arg]
Version:
0.1.0
Commands:
cli_tool hello user
$ ./target/cli_tool hello ksk
Hello, ["ksk"]
現状はサブコマンドやオプション引数を取る場合はActionの関数側でパースするしかないので、機能追加したい。
Thanks for reading!