Подкоманды
Структурированные CLI
«Подкоманды» — бесплатный урок Learn Rust Coding на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn Rust Coding, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn Rust Coding содержит 4 уроков всего.
Что такое подкоманды?
Подкоманды позволяют одному двоичному файлу предоставлять несколько действий, например git commit и git push.
- У каждой подкоманды есть собственные аргументы
- Структура масштабируется по мере роста CLI
clap представляет их в виде вложенных значений Command.
Добавление подкоманды
Подключите дочернюю команду с помощью .subcommand(). Родительская команда становится диспетчером.
use clap::Command;
fn main() {
Command::new("todo")
.subcommand(Command::new("add"))
.subcommand(Command::new("list"))
.get_matches();
}Определение выбранной подкоманды
После разбора subcommand() сообщает, какая дочерняя команда была запущена. Сопоставьте её имя, чтобы передать управление.
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();
}Чтение аргументов подкоманды
Второй элемент кортежа — это 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 с подкомандами — сопоставление со строкой. Этот исполняемый пример повторяет логику диспетчеризации.
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. Теперь ls работает так же, как list.
use clap::Command;
fn main() {
Command::new("todo")
.subcommand(
Command::new("list").visible_alias("ls")
)
.get_matches();
}Возврат кодов завершения
Качественный CLI сообщает об успехе или сбое. Верните ненулевой код из подкоманды с помощью std::process::exit или возвращая Result из main.
fn main() {
let success = true;
if !success {
std::process::exit(1);
}
println!("ok");
}Быстрая проверка
Проверьте, насколько хорошо Вы усвоили подкоманды.
Повторение
Теперь Вы умеете создавать структурированные CLI с помощью подкоманд:
- Добавлять дочерние команды с помощью
.subcommand() - Передавать управление, сопоставляя результат
m.subcommand() - Использовать для каждой подкоманды собственные аргументы и страницу справки
- Применять
subcommand_requiredи псевдонимы для улучшения интерфейса
Далее: API derive, превращающий структуры в разборщики аргументов.
Часто задаваемые вопросы
Урок «Подкоманды» бесплатный?
Да — полный текст урока «Подкоманды» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn Rust Coding, подпишись на CoddyKit PRO. Курс Learn Rust Coding содержит 4 уроков всего.
Чему я научусь в уроке «Подкоманды»?
Структурированные CLI Ты практикуешь Learn Rust Coding с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Learn Rust Coding?
Предыдущий опыт не требуется. Learn Rust Coding на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Подкоманды»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Learn Rust Coding?
Да. Каждый урок Learn Rust Coding включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основы clap
- Подкоманды
- API derive
- Проверка и справка