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!