サブコマンド
構造化されたCLI
「サブコマンド」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全4レッスンが含まれています。
サブコマンドとは
サブコマンドを使うと、git commit や git push のように、1つのバイナリで複数の操作を提供できます。
- 各サブコマンドは独自の引数を持ちます
- CLI が大きくなっても構造を拡張できます
clap では、ネストした Command の値でこれをモデル化します。
サブコマンドの追加
.subcommand() で子コマンドを追加します。親コマンドがディスパッチャーになります。
use clap::Command;
fn main() {
Command::new("todo")
.subcommand(Command::new("add"))
.subcommand(Command::new("list"))
.get_matches();
}選択されたサブコマンドとのマッチング
解析後、subcommand() でどの子コマンドが実行されたかが分かります。名前を match して処理を振り分けます。
use clap::Command;
fn main() {
let m = Command::new("todo")
.subcommand(Command::new("add"))
.subcommand(Command::new("list"))
.get_matches();
match m.subcommand() {
Some(("add", _)) => println!("adding"),
Some(("list", _)) => println!("listing"),
_ => println!("no subcommand"),
}
}サブコマンド内の引数
サブコマンドは独自の引数を持ちます。以下の add コマンドはタスクの説明を受け取ります。
use clap::{Command, Arg};
fn main() {
Command::new("todo")
.subcommand(
Command::new("add")
.arg(Arg::new("task").required(true))
)
.get_matches();
}サブコマンドの引数の読み取り
タプルの2番目の要素がサブコマンドの ArgMatches です。トップレベルの場合と同じように、そこから値を取り出します。
use clap::{Command, Arg};
fn main() {
let m = Command::new("todo")
.subcommand(Command::new("add").arg(Arg::new("task")))
.get_matches();
if let Some(("add", sub)) = m.subcommand() {
let task = sub.get_one::<String>("task").unwrap();
println!("add: {}", task);
}
}サブコマンドの必須化
subcommand_required(true) を使うと、引数なしでバイナリを実行したときに何もせず終了する代わりにヘルプを表示できます。
use clap::Command;
fn main() {
Command::new("todo")
.subcommand_required(true)
.arg_required_else_help(true)
.subcommand(Command::new("list"))
.get_matches();
}素の Rust でディスパッチをモデル化する
サブコマンド CLI の中心は、文字列に対する match です。この実行可能な例では、そのディスパッチ処理を再現しています。
fn main() {
let cmd = "add";
let task = "Buy milk";
match cmd {
"add" => println!("Added: {}", task),
"list" => println!("Listing tasks"),
other => println!("Unknown command: {}", other),
}
}ネストしたサブコマンド
サブコマンドには、それ自体にサブコマンドを持たせることもできます。たとえば cargo build --release のように、さらに深い階層を作れます。.subcommand() の呼び出しを追加して入れ子にしてください。
use clap::Command;
fn main() {
Command::new("app")
.subcommand(
Command::new("config")
.subcommand(Command::new("get"))
.subcommand(Command::new("set"))
)
.get_matches();
}サブコマンドごとのヘルプ
各サブコマンドには独自の --help ページが用意されます。about 文字列を追加して、サブコマンドの説明を記述してください。
use clap::Command;
fn main() {
Command::new("todo")
.subcommand(
Command::new("add").about("Add a new task")
)
.get_matches();
}エイリアス
visible_alias を使うと、ユーザーにショートカットを提供できます。これで list と同様に ls も使えるようになります。
use clap::Command;
fn main() {
Command::new("todo")
.subcommand(
Command::new("list").visible_alias("ls")
)
.get_matches();
}終了コードを返す
完成度の高い CLI は、成功または失敗を通知します。std::process::exit を使うか、main から Result を返すことで、サブコマンドから 0 以外のコードを返せます。
fn main() {
let success = true;
if !success {
std::process::exit(1);
}
println!("ok");
}理解度チェック
サブコマンドについての理解度を確認しましょう。
まとめ
サブコマンドを使って、構造化された CLI を作成できるようになりました。
.subcommand()で子コマンドを追加するm.subcommand()の結果を照合して処理を振り分ける- 各サブコマンドには独自の引数とヘルプページがある
subcommand_requiredとエイリアスを使って使いやすくする
次は、derive API を使って構造体を引数パーサーに変換します。
よくある質問
「サブコマンド」レッスンは無料ですか?
はい。「サブコマンド」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全4レッスンが含まれています。
「サブコマンド」で何を学びますか?
構造化されたCLI ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn Rust Codingを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「サブコマンド」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn Rust Codingレッスンでコードを書いて実行できますか?
はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- clapの基礎
- サブコマンド
- Derive API
- 検証とヘルプ