Вот как вы можете построить свой собственный анализатор Markdown: Часть 2 - Как прочитать файл из командной строки

Вот как вы можете построить свой собственный анализатор Markdown: Часть 2 - Как прочитать файл из командной строки

3 августа 2025 г.

В этом посте мы будем реализовать интерфейс командной строки, который примет файл разметки в качестве аргумента командной строки, прочитать его контент и распечатать весь содержимое файла в терминале.

После этого мы будем на своем пути, чтобы начать внедрять анализ базовых текстов, заголовков, списков и так далее.

Я подробно объясню весь код, и, в конце концов, я дам вам весь код, чтобы вы могли попробовать без каких -либо проблем.

Требуемые модули

Есть два модуля, которые нам нужно использовать:

  • std::env- Нам нужноenvМодуль для взаимодействия с средой, в которой в настоящее время работает программа. Теперь мы используем его здесь для доступа к аргументам командной строки, передаваемых нашей программе.

  • std::fs- Нам нужноfsДля операций файлов, таких как чтение и написание в файлы.

    Используйте std :: env; Используйте std :: fs;

Получение файла разметки из командной строки.

После получения необходимых модулей мы можем начать работать над получением файла разметки из аргумента командной строки. С этого момента мы будем писать каждую строку кода внутри основной функции.

let args: Vec<String> = env::args().collect();

Давайте поймем, что делает эта линия.

  • env::args()- Эта функция возвращает итератор аргументов, представленных в командной строке в программу.
  • collect()- Затем мы используем метод collect () для употребления итератора и собирать все элементы из этого итератора в коллекцию.
  • Vec<String>- Чтобы хранить все предметы из итератора, мы используем векторную коллекцию, которая хранит элементы типаStringПолем Мы дали имя переменной этогоVec<String>какargsПолем Итак, этоargsудерживает все элементы из итератора этой командной строки.

Теперь давайте рассмотрим случай, когда пользователь сознательно или неосознанно пропускает, давая файл разметки в аргументе командной строки. В этом случае нам нужно попросить пользователя предоставить файл разметки.

if args.len() < 2 {
		println!("Please provide a markdown file");
		return;
}

Здесь мы говорим, что если количество команд меньше 2, то распечатайте оператор с просьбой предоставить пользователя файл разметки, а затем вернуться из программы.

[! Примечание] Количество аргументов в командной строке, первый аргумент - это имя программы. Нам нужен еще один аргумент, который будет представлять имя файла. Следовательно, нам нужна длинаargsбыть не менее 2.

Чтение файла и печать его контента.

Теперь давайте сохраним имя файла, которое мы получили из аргумента командной строки.

let filename = &args[1];

Мы создаем переменнуюfilenameи хранение имени файла в 2-й командной строке аргумента.

Теперь давайте начнем читать необработанное содержание файла и распечатать весь контент как есть.

println!("Attempting to read file: {}", filename);
let content = fs::read_to_string(filename).expect("Something went wrong reading the file");
println!("File content:\n{}", content);
  • Во -первых, мы просто печатаем оператор журнала, чтобы узнать, что мы пытаемся прочитать файл.
  • fs::read_to_string(filename)- Эта функция происходит отfsмодуль, который считывает весь содержимое файла, указанное именем файла.
  • Затем мы храним весь контент вcontentпеременная и, наконец, распечатать весь контент на консоли.

Прежде чем объяснитьexpect()Метод, давайте поймем конкретный тип данных в ржавчине.

Resultв ржавчине

В ржавчине способ справляться с операциями, которые могут потерпеть неудачу, - это использованиеResultтип. Это перечисление с двумя вариантами:

enum Result<T, E> {
    Ok(T),    // Success - contains the value of type T
    Err(E),   // Error - contains the error of type E
}

Теперь давайте вернемся кfs::read_to_string()функция Если вы посмотрите в документы, он возвращаетResultтип и для успеха, он возвращаетStringтип, и для случая сбоя, он возвращаетstd::io::Errorтип.

Теперь давайте подключим это сexpect()метод

Этотexpect()Метод - это ярлык, который говорит:

  • еслиfs::read_to_string()работает нормально и возвращаетсяOk(string), затем верните значение строки.
  • еслиfs::read_to_string()Не работает, затем сбой программы с помощью пользовательского сообщения об ошибке («что -то пошло не так, читая файл»).

Тестирование программы

Чтобы проверить, давайте создадимtest.mdФайл в корне проекта и поместите немного текста случайной отметки.

# this is a header
- this is a list
this is a normal text

Теперь откройте свой терминал из вашего каталога проекта и введите команду:

cargo run -- test.md

Он скомпилирует и выполнит код и даст вам следующий вывод.

reading raw content from markdown file

Этот вывод показывает, что мы можем успешно получить содержимое файла Markdown и распечатать его необработанные данные. В следующем посте мы начнем узнавать о анализе.

Полный исходный код

use std::env;
use std::fs;

fn main() {
    let args: Vec<String> = env::args().collect();

    if args.len() < 2 {
        println!("Please provide a markdown file");
        return;
    }

    let filename = &args[1];

    println!("Attempting to read file: {}", filename);

    let content = fs::read_to_string(filename).expect("Something went wrong reading the file");

    println!("File content:\n{}", content);
}

Заключение

В этом посте мы поняли, как взаимодействовать с командной строкой, а также прочитать файл Markdown из аргумента командной строки. Мы также поняли базовую обработку ошибок, используяResultГде мы знаем, что все может пойти не так, и мы позаботились о том, чтобы наша программа смогла справиться с этим.

Теперь мы понимаем, что чтение и печать всего содержимого файла Markdown. Из следующего поста мы постепенно собираемся реализовать наш алгоритм анализа по шагам и охватывать базовый текст, заголовки, списки и другие вещи один за другим. Я очень рад следующему посту; Надеюсь, ты тоже взволнован. До скорой встречи.


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE