0Pricing
Learn Rust Coding · Урок

Проверка и справка

Отточенные CLI

«Проверка и справка» — бесплатный урок Learn Rust Coding на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn Rust Coding, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn Rust Coding содержит 4 уроков всего.

Улучшение CLI

Хороший CLI заранее проверяет ввод и предоставляет понятную справку. clap поддерживает и то и другое с помощью атрибутов и разборщиков значений.

  • Отклоняйте неверные значения с понятными сообщениями
  • Документируйте каждый аргумент

Диапазоны значений

Ограничьте числовой аргумент диапазоном с помощью 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,
}

Пользовательская функция проверки

Передайте в value_parser функцию, возвращающую Result. 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 запрещает одновременное использование двух несовместимых флагов.

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,
}

Возврат Result из main

Для ошибок во время выполнения после разбора возвращайте Result из main. Оператор ? передаёт ошибки выше, а программы без clap выводят их с ненулевым кодом завершения.

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 моделирует несовместимые флаги
  • Документирующие комментарии становятся текстом справки
  • Возвращайте Result из main для обработки ошибок во время выполнения

На этом курс по clap завершён.

Часто задаваемые вопросы

Урок «Проверка и справка» бесплатный?

Да — полный текст урока «Проверка и справка» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn Rust Coding, подпишись на CoddyKit PRO. Курс Learn Rust Coding содержит 4 уроков всего.

Чему я научусь в уроке «Проверка и справка»?

Отточенные CLI Ты практикуешь Learn Rust Coding с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Learn Rust Coding?

Предыдущий опыт не требуется. Learn Rust Coding на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Проверка и справка»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Learn Rust Coding?

Да. Каждый урок Learn Rust Coding включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы clap
  2. Подкоманды
  3. API derive
  4. Проверка и справка
← Назад к Learn Rust Coding