0Pricing
Learn Rust Coding · レッスン

検証とヘルプ

洗練された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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. clapの基礎
  2. サブコマンド
  3. Derive API
  4. 検証とヘルプ
← Learn Rust Codingに戻る