| Crates.io | ini_parser_gladun |
| lib.rs | ini_parser_gladun |
| version | 0.1.2 |
| created_at | 2025-11-12 00:40:44.216657+00 |
| updated_at | 2025-11-12 23:07:38.444275+00 |
| description | INI file parser library and CLI, built with pest. |
| homepage | |
| repository | https://github.com/OstapGladun/ini_parser |
| max_upload_size | |
| id | 1928527 |
| size | 40,290 |
ini_parser — бібліотека та утиліта командного рядка на Rust для парсингу .ini файлів. Вона створена з використанням pest для реалізації PEG (Parsing Expression Grammar).
Типізований парсинг: Розрізняє рядки, числа (цілі та з комою) та булеві значення (true/false/yes/no).
Гнучкі імена: Підтримує секції та ключі з крапками (напр., [database.prod] або server.host = ...).
Коментарі: Коректно ігнорує коментарі на весь рядок (# або ;) та вбудовані коментарі (в кінці рядка).
CLI та Бібліотека: Може використовуватися як утиліта в терміналі або як залежність у вашому проекті.
Надійна обробка помилок: Використовує thiserror для бібліотеки та anyhow для бінарного файлу.
Парсинг виконується за допомогою pest на основі граматики, визначеної у файлі src/grammar.pest.
Парсер визначає структуру INI файлу за допомогою наступних правил. Граматика підтримує пропуск пробілів та коментарів.
NEWLINE = _{ "\r\n" | "\n" | "\r" }
WHITESPACE = _{ " " | "\t" }
LINE_COMMENT = _{ (";" | "#") ~ (!NEWLINE ~ ANY)* }
INLINE_COMMENT = _{ (";" | "#") ~ (!NEWLINE ~ ANY)* }
string_quoted = @{ "\"" ~ (!("\"" | NEWLINE) ~ ANY)* ~ "\"" }
boolean = @{ "true" | "false" | "yes" | "no" }
number = @{ ("-" | "+")? ~ (ASCII_DIGIT+ ~ ("." ~ ASCII_DIGIT+)?) }
string_simple = @{ !("\"") ~ (!(";" | "#" | NEWLINE) ~ ANY)+ }
value = { string_quoted | boolean | number | string_simple }
identifier = @{ (ASCII_ALPHANUMERIC | "_" | "-")+ }
dotted_identifier = @{ identifier ~ ("." ~ identifier)* }
pair = { dotted_identifier ~ WHITESPACE* ~ "=" ~ WHITESPACE* ~ value ~ (WHITESPACE* ~ INLINE_COMMENT)? }
section = { "[" ~ dotted_identifier ~ "]" }
line = { (section | pair | LINE_COMMENT | NEWLINE) }
file = { SOI ~ line* ~ EOI }
Логіка в src/lib.rs (функція parse_ini) отримує дерево розбору (AST) від pest і перетворює його у структуровані дані Rust.
Вихідна структура: HashMap<String, HashMap<String, IniValue>>
HashMap<String, ...>: Карта, де ключ — це назва секції (String).
[section], зберігаються під спеціальним "глобальним" ключем "" (порожній рядок).HashMap<String, IniValue>: Карта пар ключ-значення для конкретної секції.IniValue: Це enum, який зберігає типизовані дані:
IniValue::String(String)IniValue::Number(f64)IniValue::Boolean(bool)Приклад:
Вхідний файл .ini:
global_key = true
[server]
host = "127.0.0.1"
port = 8080
Буде перетворено у таку структуру (умовно):
{
"": {
"global_key": Boolean(true)
},
"server": {
"host": String("127.0.0.1"),
"port": Number(8080.0)
}
}
Проект включає CLI, зібраний за допомогою clap.
Отримання допомоги:
cargo run -- --help
Парсинг файлу:
cargo run -- parse --file examples/example.ini
Відображення авторів:
cargo run -- credits
MakefileДля зручності розробки надається Makefile.
make run ARGS="...": Запускає програму з аргументами (напр., make run ARGS="parse --file examples/example.ini").make test: Запускає всі юніт-тести.make fmt: Форматує код за допомогою cargo fmt.make lint: Перевіряє код за допомогою cargo clippy.make check: Виконує fmt, lint та test по черзі (для перевірки перед комітом).make publish: Запускає check і (якщо успішно) публікує крейт на crates.io.