Инструмент, написан на Rust за рекурсивно търсене във всички файлове, разположени в папка

Колко пъти сте преглеждали файлове, за да намерите някакъв низ или произход на функция?

Locate е инструмент, написан на Rust, който преминава през всеки файл рекурсивно и дава точното местоположение на низа на заявката във файловете.

Той е светкавично бърз, както е написано в Rust, и може рекурсивно да се разхожда из директориите.

Мотивация

Исках да науча Rust и смятам, че най-добрият начин да научите нов език е като създадете проект.

Винаги съм използвал функцията за търсене във VS Code, за да намеря произхода на функция или местата, където се използва функцията. Ако работите с големи проекти, понякога става трудно точното локализиране на всички точки, където се използва дадена функция. Разбира се, човек може да следва импортиранията, за да проследи обратно произхода на дадена функция, но наличието на инструмент понякога може да бъде полезно.

Забележка: Тъй като това е първият ми проект в Rust, има възможност да съм направил определени неща по различен начин, отколкото трябваше.

Да започваме.

Създаване на нов пакет

За стартиране на нов пакет правим cargo new, тъй като това е двоична програма:

cargo new locate --bin

Това създава структура на папки:

. 
├── Cargo.toml 
└── src 
    └── main.rs 
1 directory, 2 files

Пакети, от които се нуждаем

fstream = "0.1.2"
walkdir = "2.3.1"
argparse = "0.2.2"
colored = "1.9"
  • fstreamще се използва за четене на файла.
  • walkdirще се използва за обхождане на всички папки и файлове.
  • argparseе прост анализатор на аргументи за анализиране на аргументи.
  • colored ще се използва за оцветяване на изхода на терминала.

Добавете ги към вашия cargo.toml.

Сега нашият cargo.toml ще изглежда така:

Код

Основен код

Нашият основен работен процес ще бъде както следва. Първо, ще вземем path и query от потребителя. След това имаме нужда от функция, която да обхожда всички папки в пътя и да проверява дали низът на заявката присъства във всеки файл. Ако е така, пътят на файла ще бъде предаден на друга функция, където ще се намира точното местоположение на низа на заявката.

Разходката в директорията е лесна, тъй като ще използваме walkdir за това.

Код за checking dir

Създаваме нов Walkdir по дадения път и прилагаме филтър, за да заглушим грешката в разрешението.

След това проверяваме дали iter е файл. След това използваме fstrem, за да проверим дали низът на заявката е във файла или не.

След като получим файла със заявката, той се предава на друга функция, която намира точния номер на реда.

Код за проверка на файла

Просто е: четем целия файл ред по ред. Тъй като връща вектор на низ, можем лесно да преминем през всеки ред и да проверим дали низът на заявката присъства или не.

Ако има, ние просто го отпечатваме. Има форматиране за печат (като .green(), .bold() и т.н.), което се извършва с помощта на щайга colored, която импортирахме по-рано.

Това е всичко. Имаме код и за двете части, четене на файла и намиране на файла.

Остава да анализирате аргументи от командния ред. Анализаторът на аргументите на библиотеката е вдъхновен от argparse в Python.

Код за парсер на аргументи

Тази част също е доста проста. Създаваме две променливи променливи (променливите в Rust са неизменни по подразбиране). След това ще създадем нов обект argpaser, ще зададем неговото описание и ще създадем нашите опции. Най-хубавото е, че автоматично генерира помощното съобщение, използвайки нашето описание за всяка опция.

Свършен. Да пробваме!

Тип cargo build. Ще намерите двоичен файл, създаден в target/debug. Можете да го стартирате директно от cargo run или като използвате двоичния файл, който току-що създадохте.

ДЕМОНСТРАЦИЯ

Можете да намерите целия изходен код в GitHub.

Освен това, ако не искате да правите всичко това, можете да го инсталирате директно, като използвате: cargo install locate. Или можете да го проверите на cargo@locate.

Благодаря за четенето. Приятно кодиране!