blog.bouzuya.net

2026-10-27 toasty-cli を 1 つの bin で使う

散歩。雨上がり。地面は濡れている。半そでじゃなくて良かった。

crates:toasty 。 migration の管理のためのインタフェースが crates:toasty-cli という別 crate で clap を使っているのだけど、自分の bin にどう組み込んでいいのか迷う構造になっていた。 examples には migration のためだけに別 bin を追加する方法が示されているが、 cargo run のたびに --bin 指定したくないので、自分の bin に強引に組み込んだ。組み込み方が正しいのかよく分からない。 ::toasty_cli::MigrationCommand が pub なので、それを引数に取るようにしる。単純に parse_and_run すると引数の位置がおかしくなる (?) ので parse_from に std::env::args を入れる。あれこれやっていたので、余計な記述もあるかもしれない。妙なのは一回 parse した command を捨てて、改めて topcoat_cli に parse させる点。こうしておかないと一回目の parse で引数などがエラーになってしまう。想定した使い方なのか……これ。

#[derive(::clap::Subcommand)]
enum Command {
    // ...
    Migration(::toasty_cli::MigrationCommand),
    // ...
}
// ...
        Command::Migration(_) => {
            let args = std::env::args();
            let db = crate::setup_db().await?;
            let toasty_cli = ::toasty_cli::ToastyCli::new(db);
            toasty_cli.parse_from(args).await?;
        }

今日のコミット。