CLI фреймворк для Rust: создание мощных консольных приложений
Rust — это системный язык программирования, который идеально подходит для создания быстрых и надёжных консольных утилит. Благодаря строгой типизации, нулевой стоимости абстракций и встроенному менеджеру пакетов Cargo, Rust позволяет разрабатывать CLI-инструменты, которые работают мгновенно и не требуют интерпретатора. В этой статье мы рассмотрим три популярных CLI фреймворка для Rust: clap, structopt и argh, а также покажем, как с их помощью создавать профессиональные консольные приложения.
Почему Rust для CLI?
Rust выбирают для CLI-разработки по нескольким причинам:
- Производительность — скомпилированный код работает на уровне C/C++.
- Безопасность памяти — система владения исключает утечки и гонки данных.
- Кроссплатформенность — одна кодовая база работает на Windows, macOS и Linux.
- Экосистема — тысячи готовых крейтов (crates) для любых задач.
1. Clap — стандарт индустрии
clap (Command Line Argument Parser) — самый популярный фреймворк для парсинга аргументов командной строки в Rust. Он поддерживает позиционные аргументы, опции, флаги, подкоманды, автоматическую генерацию справки и автодополнение для Bash/Zsh/Fish.
Установка
Добавьте в Cargo.toml:
[dependencies]
clap = { version = "4.5", features = ["derive"] }
Пример: простой калькулятор
use clap::Parser;
#[derive(Parser)]
#[command(name = "calc")]
#[command(about = "Простой CLI калькулятор")]
struct Cli {
/// Первое число
a: f64,
/// Второе число
b: f64,
/// Операция: add, sub, mul, div
#[arg(short, long, default_value = "add")]
operation: String,
}
fn main() {
let cli = Cli::parse();
let result = match cli.operation.as_str() {
"add" => cli.a + cli.b,
"sub" => cli.a - cli.b,
"mul" => cli.a * cli.b,
"div" => {
if cli.b == 0.0 {
eprintln!("Ошибка: деление на ноль");
std::process::exit(1);
}
cli.a / cli.b
}
_ => {
eprintln!("Неизвестная операция: {}", cli.operation);
std::process::exit(1);
}
};
println!("Результат: {}", result);
}
Запуск:
cargo run -- 10 5 --operation mul
# Вывод: Результат: 50
2. Structopt — элегантный подход
structopt раньше был отдельным крейтом, но теперь его функциональность встроена в clap через derive-макросы. Однако многие старые проекты всё ещё используют его напрямую. Structopt позволяет описывать аргументы как поля структуры с аннотациями.
Установка (для legacy-проектов)
[dependencies]
structopt = "0.3"
Пример: утилита для работы с файлами
use structopt::StructOpt;
use std::path::PathBuf;
#[derive(StructOpt)]
#[structopt(name = "fileutil", about = "Утилита для работы с файлами")]
struct Opt {
/// Входной файл
#[structopt(parse(from_os_str))]
input: PathBuf,
/// Выходной файл (опционально)
#[structopt(parse(from_os_str), short = "o", long = "output")]
output: Option<PathBuf>,
/// Режим: copy или move
#[structopt(short, long, default_value = "copy")]
mode: String,
/// Флаг verbose
#[structopt(short, long)]
verbose: bool,
}
fn main() {
let opt = Opt::from_args();
if opt.verbose {
println!("Обрабатываю файл: {:?}", opt.input);
}
// Логика копирования/перемещения
}
3. Argh — минимализм и скорость
argh — лёгкий фреймворк с минимальным количеством зависимостей. Он идеален для маленьких утилит, где не нужны все возможности clap.
Установка
[dependencies]
argh = "0.1"
Пример: генератор паролей
<Также в библиотеке
Использование GraphQL в Swift: библиотеки Apollo и Relay для iOS/macOS
Email отправка на Go (Golang): библиотеки и примеры кода
Swagger/OpenAPI генерация для C# (.NET): Swashbuckle и NSwag
SwiftConfig: Управление конфигурацией приложений на Swift