Часто виникає потреба автоматизувати рутинні завдання, особливо коли мова йде про системне адміністрування або розробку інструментів для команди. Відсутність зручного CLI інструменту може сповільнити розробку на 10-20% через необхідність вручну виконувати повторювані дії. Rust ідеально підходить для створення таких інструментів, забезпечуючи безпеку, швидкість та низький footprint.
Контекст і чому це важливо
Створення CLI інструментів часто ігнорується, особливо на початкових етапах проєкту. Розробники схильні зосереджуватися на core functionality, відкладаючи автоматизацію на потім. Це призводить до ручної роботи, збільшення ймовірності помилок та втрати часу.
Ігнорування необхідності в CLI інструментах може призвести до накопичення технічного боргу, ускладнення підтримки та збільшення витрат на розробку. Наприклад, якщо автоматизація тестування займає 2 години на тиждень, це може коштувати компанії до 1000$ на місяць лише на зарплату розробника, який цим займається.
Практична реалізація
Ми створимо простий CLI інструмент, який виводить список файлів у вказаній директорії, відсортований за розміром. Це дозволить продемонструвати базові принципи роботи з `clap` для парсингу аргументів та `std::fs` для роботи з файловою системою.
use clap::Parser;
use std::fs;
use std::path::Path;
use std::cmp::Ordering;
#[derive(Parser, Debug)]
#[command(author = "Your Name", version = "1.0", about = "Lists files in a directory, sorted by size", long_about = None)]
struct Args {
/// The directory to list files from
#[arg(short, long, default_value = ".")]
directory: String,
}
fn main() {
let args = Args::parse();
let path = Path::new(&args.directory);
if !path.is_dir() {
println!("Error: {} is not a directory", args.directory);
return;
}
let mut files: Vec<_> = fs::read_dir(path)
.unwrap()
.filter_map(|entry| entry.ok())
.collect();
files.sort_by(|a, b| {
let size_a = a.metadata().unwrap().len();
let size_b = b.metadata().unwrap().len();
size_a.cmp(&size_b)
});
for file in files {
println!("{:?}", file);
}
}
Цей код використовує бібліотеку `clap` для обробки аргументів командного рядка, визначає структуру `Args` для зберігання аргументів, а потім зчитує директорію, отримує інформацію про файли та сортує їх за розміром. Потім файли виводяться на екран.
Поширені помилки та підводні камені
- Неправильний парсинг аргументів: Найчастіша помилка – забути обробити всі можливі варіанти аргументів. Наприклад, якщо користувач не вказує директорію, програма може падіти.
- Помилки при роботі з файловою системою: Обов’язково перевіряйте, чи існує директорія, чи має програма права на читання файлів. Не оброблені помилки можуть призвести до падіння програми або непередбачуваної поведінки.
- Використання `unwrap()` без обробки помилок: `unwrap()` зручний, але небезпечний. Краще використовувати `match` або `if let` для обробки можливих помилок, щоб програма не паділа. Наприклад, використання `match fs::read_dir(path)` замість `fs::read_dir(path).unwrap()` дозволить обробити ситуацію, коли директорія не існує.
Порівняння підходів
Раніше для створення CLI інструментів часто використовували Bash скрипти. Bash скрипти легко писати, але вони повільні, ненадійні та мають обмежену функціональність. Вони також схильні до помилок через відсутність статичної типізації.
Rust CLI інструменти набагато швидші (у 5-10 разів швидше за Bash скрипти), безпечніші та мають більш широкі можливості. Вони також дозволяють використовувати потужні бібліотеки Rust для виконання складних завдань.
Висновки
Цей підхід найкраще підходить для автоматизації рутинних завдань, особливо коли потрібна висока продуктивність та надійність. Почніть з простого CLI інструменту для автоматизації одного завдання, щоб отримати досвід роботи з Rust та бібліотекою `clap`. Встановіть Rust та створіть новий проєкт з `cargo new my_cli_tool` прямо зараз.