rcp_palette

Crates.iorcp_palette
lib.rsrcp_palette
version0.2.0
created_at2025-11-19 20:01:21.108329+00
updated_at2025-11-20 00:38:22.100551+00
descriptionПростий і надійний парсер для перетворення рядкових представлень CSS-кольорів (Hex, RGB, HSL, іменовані) у внутрішню структуру даних Rust.
homepage
repositoryhttps://github.com/dahl1a-bloom/rcp-pallete
max_upload_size
id1940724
size32,164
Daryna Savarina (dahl1a-bloom)

documentation

https://docs.rs/rcp-palette

README

rcp-palette 🎨 (CSS Color Parser)

Простий і надійний парсер для перетворення рядкових представлень CSS-кольорів у внутрішню структуру даних Rust.

Технічний опис процесу парсингу

Проєкт rcp-palette парсить рядки, що відповідають CSS-нотації кольорів. На поточному етапі підтримуються формати:

  1. #RRGGBB (наприклад, #1A2B3C);
  2. #RGB (наприклад, #FA0);
  3. rgb(R, G, B) (наприклад, rgb(255, 170, 0));
  4. hsl(H, S%, L%) (наприклад, hsl(0, 100%, 50%));
  5. Іменовані кольори (наприклад, red, blue, rebeccapurple).

Граматика рядкових записів кольорів

Color := Named | Hex | Rgb | Hsl

Named := "black" | "white" | "red" | "green" | "blue" | "yellow" | "cyan" | "magenta" | "gray" | "grey" | "rebeccapurple"

Hex   := "#" (Hex6|Hex3)

Hex6  := HHHHHH          ; шість шістнадцяткових символів

Hex3  := HHH             ; три шістнадцяткових символи

Rgb   := "rgb" "(" Int "," Int "," Int ")"

Hsl   := "hsl" "(" Int "," Int "%" "," Int "%" ")"

H     := [0-9A-Fa-f]

Int   := 0..255          ; десяткові цілі та пробіли

Алгоритмічний опис процесу парсингу

  • Рядкове задання кольору передається функції parse_color().

  • Якщо рядок співпадає з іменованим CSS-кольором (наприклад, red, blue, rebeccapurple), спочатку він нормалізується до нижнього регістру, після чого виконується пошук у вбудованій таблиці відповідностей. У разі успіху повертається відповідна трійка компонентів Color { r, g, b }. Якщо жодна назва не співпадає, парсер переходить до наступних правил.

  • Якщо рядок починається з #, то викликається Hex-parser, котрий виконує валідацію (та підгон за потреби) його довжини та відповідності його символів, після чого виконується потрібна конвертація відформатованого Hex-рядка у структуру Color.

  • Якщо рядок починається з rgb(, то викликається RGB-парсер, котрий виокремлює числові компоненти поміж дужками з обробкою використання пробілів. Надалі відбувається валідація їх кількостей та приналежностей діапазону цілих чисел від 0 до 255, після чого вони безпосередньо стають компонентами структури Color.

  • Якщо рядок починається з hsl(, то викликається HSL-парсер, котрий виокремлює три компоненти H, S% та L% поміж дужками з обробкою використання пробілів. Надалі відбувається:

    • парсинг H у градусах (довільне дійсне число, нормалізується по модулю 360);
    • парсинг S та L у відсотках (0–100) з приведенням до діапазону 0.0–1.0;
    • повернення структури Color { r: u8, g: u8, b: u8 }, а саме стандартне перетворення HSL → RGB з отриманням компонет r, g, b у діапазоні 0–255.
  • Якщо рядок не відповідає жодному з цих форматів, повертається загальна помилка про недійсний префікс #.

  • Інші помилки повертаються при не успішному виконанні валідації чи форматування усіма парсерами.

  • Успішне завершення будь-якого парсера призводить до повернення об'єкта структури Color { r: u8, g: u8, b: u8 }.

Використання результатів парсингу

Успішний парсинг повертає структуру Color { r: u8, g: u8, b: u8 }. Ця структура є універсальним поданням кольору і може бути використана для:

  • графічного відображення;
  • колірних обчислень.

CLI - commands

  • parse <#HEX> — парсинг окремого кольору
  • file <path> — парсинг файлу з кольорами (по одному на рядок)
  • author — показ інформації про авторів і крейт

CLI - examples

cargo run -- parse #1A2B3C
cargo run -- parse #FA0
cargo run -- parse "rgb(255, 170, 0)"
cargo run -- file ./colors.txt
cargo run -- author

Project development

  • linting: cargo clippy
  • formatting : cargo fmt
  • tests: cargo test

License

  • MIT
Commit count: 0

cargo fmt