検証とヘルプ
洗練されたCLI
「検証とヘルプ」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全4レッスンが含まれています。
CLI を仕上げる
優れた CLI は入力を早い段階で検証し、わかりやすいヘルプを提供します。clap では、属性と value parser の両方でこれを実現できます。
- わかりやすいメッセージで不正な値を拒否する
- すべての引数を説明する
値の範囲
value_parser を使うと、数値引数を範囲内に制限できます。範囲外の入力は自動的に拒否されます。
use clap::Parser;
#[derive(Parser)]
struct Cli {
#[arg(long, value_parser = clap::value_parser!(u16).range(1..=65535))]
port: u16,
}列挙された選択肢
#[derive(ValueEnum)] を使うと、引数を決められた文字列の集合に制限できます。
use clap::{Parser, ValueEnum};
#[derive(Clone, ValueEnum)]
enum Mode { Fast, Safe }
#[derive(Parser)]
struct Cli {
#[arg(long, value_enum)]
mode: Mode,
}カスタム検証関数
Result を返す関数を value_parser に渡します。clap は Err を使い方エラーに変換します。
fn parse_even(s: &str) -> Result<u32, String> {
let n: u32 = s.parse().map_err(|_| "not a number".to_string())?;
if n % 2 == 0 { Ok(n) } else { Err("must be even".to_string()) }
}検証ロジックを試す
検証関数は通常の Rust コードです。実行して、偶数・奇数のチェックがどのように Ok または Err を返すか確認しましょう。
fn parse_even(s: &str) -> Result<u32, String> {
let n: u32 = s.parse().map_err(|_| "not a number".to_string())?;
if n % 2 == 0 { Ok(n) } else { Err("must be even".to_string()) }
}
fn main() {
println!("{:?}", parse_even("4"));
println!("{:?}", parse_even("7"));
}必須グループと競合
引数同士の関係を表現できます。conflicts_with を使うと、互いに両立しない 2 つのフラグが同時に使われるのを防げます。
use clap::Parser;
#[derive(Parser)]
struct Cli {
#[arg(long)]
quiet: bool,
#[arg(long, conflicts_with = "quiet")]
verbose: bool,
}フィールドごとのヘルプテキスト
フィールドの上に書いたドキュメントコメントは、そのフィールドのヘルプテキストになります。引数を説明する慣用的な方法です。
use clap::Parser;
#[derive(Parser)]
struct Cli {
/// The file to process
input: String,
}ロングヘルプとショートヘルプ
clap は -h には短い概要を、--help には全文を表示します。必要に応じて #[arg(short_help, long_help)] で内容を分けられます。
use clap::Parser;
#[derive(Parser)]
struct Cli {
#[arg(long, long_help = "A detailed explanation shown only with --help")]
flag: bool,
}main から Result を返す
解析後に発生する実行時エラーには、main から Result を返します。? 演算子はエラーを伝播させ、clap を使わないプログラムではエラーが表示され、終了コードが 0 以外になります。
fn main() -> Result<(), String> {
let value = "42";
let n: i32 = value.parse().map_err(|_| "bad number".to_string())?;
println!("parsed {}", n);
Ok(())
}カスタムエラーのスタイル
clap は使い方エラーを自動的に整形しますが、clap::Error と cmd.error() を使って、状況に応じた独自のメッセージを作成することもできます。
use clap::{CommandFactory, Parser};
#[derive(Parser)]
struct Cli { value: i32 }
fn fail() {
let mut cmd = Cli::command();
cmd.error(clap::error::ErrorKind::ValueValidation, "value too large").exit();
}通常の Rust による検証のまとめ
CLI の検証の本質は、値を確認してわかりやすいエラーを報告することです。ここでは、その流れを最初から最後まで示します。
fn validate_port(p: u32) -> Result<u32, String> {
if (1..=65535).contains(&p) { Ok(p) }
else { Err(format!("port {} out of range", p)) }
}
fn main() {
match validate_port(8080) {
Ok(p) => println!("using port {}", p),
Err(e) => eprintln!("error: {}", e),
}
}理解度チェック
検証とヘルプについての理解度を確認しましょう。
まとめ
これで、完成度の高い CLI を作成できるようになりました。
value_parserで範囲とカスタムルールを適用するValueEnumで選択肢を制限するconflicts_withで両立しないフラグをモデル化する- ドキュメントコメントをヘルプテキストにする
- 実行時エラーには main から
Resultを返す
これで clap のコースは完了です。
よくある質問
「検証とヘルプ」レッスンは無料ですか?
はい。「検証とヘルプ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全4レッスンが含まれています。
「検証とヘルプ」で何を学びますか?
洗練されたCLI ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn Rust Codingを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「検証とヘルプ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn Rust Codingレッスンでコードを書いて実行できますか?
はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- clapの基礎
- サブコマンド
- Derive API
- 検証とヘルプ