CLI Фреймворк для Rust: полное руководство по разработке утилит

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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"

Пример: генератор паролей

<

Рекомендаций