Проверка и справка
Отточенные 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 — локальная установка не требуется.
Все уроки этого курса
- Основы clap
- Подкоманды
- API derive
- Проверка и справка