CLI фреймворки для Rust: мощные инструменты для создания консольных приложений
Rust — это язык системного программирования, который набирает популярность благодаря своей производительности, безопасности и современным возможностям. Одно из самых распространённых применений Rust — создание утилит командной строки (CLI). От ripgrep до bat и fd — многие известные инструменты написаны на Rust. В этой статье мы рассмотрим основные CLI фреймворки для Rust, которые помогут вам быстро и качественно разрабатывать собственные консольные приложения.
Почему стоит выбрать Rust для CLI?
Rust предлагает несколько ключевых преимуществ для разработки CLI:
- Быстродействие — компилируемый код работает с минимальными накладными расходами.
- Безопасность памяти — система владения (ownership) предотвращает утечки и гонки данных.
- Кроссплатформенность — одна кодовая база работает на Windows, macOS и Linux.
- Экосистема — богатый набор библиотек для парсинга аргументов, цветного вывода, работы с конфигами.
Основные CLI фреймворки для Rust
1. Clap (Command Line Argument Parser)
Clap — самый популярный и функциональный фреймворк для парсинга аргументов командной строки в Rust. Он поддерживает автоматическую генерацию справки, подсказки, валидацию, подкоманды и многое другое.
use clap::{Parser, Subcommand};
#[derive(Parser)]
#[command(name = "git")]
#[command(about = "A fictional version of git", long_about = None)]
struct Cli {
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
/// Clone a repository
Clone {
/// URL of the repository
url: String,
},
/// Push changes
Push {
/// Remote name
remote: String,
/// Branch name
branch: String,
},
}
fn main() {
let cli = Cli::parse();
match &cli.command {
Commands::Clone { url } => println!("Cloning from {}", url),
Commands::Push { remote, branch } => println!("Pushing to {} branch {}", remote, branch),
}
}
Clap предоставляет два подхода: декларативный (через derive-макросы) и функциональный (через Builder API). Для большинства проектов рекомендуется использовать derive-подход — он короче и читаемее.
2. StructOpt
StructOpt — это надстройка над Clap, которая позволяет определять аргументы через структуры. Начиная с версии 3.0, Clap встроил функциональность StructOpt напрямую, поэтому сейчас StructOpt считается устаревшим. Однако многие старые проекты всё ещё его используют.
use structopt::StructOpt;
#[derive(StructOpt)]
struct Cli {
#[structopt(short = 'n', long = "name")]
name: String,
#[structopt(short = 'c', long = "count", default_value = "1")]
count: u32,
}
fn main() {
let args = Cli::from_args();
for _ in 0..args.count {
println!("Hello, {}!", args.name);
}
}
Важно: для новых проектов используйте Clap с derive-макросами — это современная и поддерживаемая альтернатива.
3. Argh
Argh — лёгкий и быстрый фреймворк, который фокусируется на минимализме. Он не требует дополнительных зависимостей (кроме самого себя) и компилируется очень быстро. Идеально подходит для небольших утилит.
use argh::FromArgs;
#[derive(FromArgs)]
/// A simple greeting tool
struct Greeting {
/// name to greet
#[argh(option, short = 'n')]
name: String,
/// number of times to greet
#[argh(option, short = 'c', default = "1")]
count: u32,
}
fn main() {
let greeting: Greeting = argh::from_env();
for _ in 0..greeting.count {
println!("Hello, {}!", greeting.name);
}
}
Argh поддерживает только derive-подход и не предоставляет Builder API. Это осознанное решение разработчиков — сохранять библиотеку простой и предсказуемой.
4. clap-verbosity-flag
Это вспомогательная библиотека, которая расширяет Clap поддержкой флагов уровня детализации (-v, -vv, -q). Она автоматически настраивает логирование через env_logger или log.
use clap::Parser;
use clap_verbosity_flag::Verbosity;
#[derive(Parser)]
struct Cli {
#[command(flatten)]
verbose: Verbosity,
}
fn main() {
let cli = Cli