現在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の関数側でパースするしかないので、機能追加したい。