Gradient Pattern DSL
В gradiente есть небольшой DSL (domain-specific language), который используется для описания и валидации структуры ABI градиентов.
Это не regex-движок и не универсальный парсер.
Это строгий минималистичный язык правил, предназначенный именно для описания градиентных паттернов.
🧠 Какую задачу он решает
Градиенты могут иметь множество допустимых форм:
config, color-stop, color-stop
color-stop, color-hint, color-stop
color-stop, color-stop, color-stopВместо хардкода правил для каждого типа градиента DSL позволяет задавать их декларативно:
^[color-stop,~color-stop].🧩 Концепты ядра
DSL валидирует типы, а не строки.
Перед валидацией входные данные преобразуются в ABI:
[
{ type: "config" },
{ type: "color-stop" },
{ type: "color-hint" },
{ type: "color-stop" }
]DSL сопоставляет:
config, color-stop, color-hint, color-stop🔤 Токены
Сущности
| Токен | Значение |
|---|---|
config | конфигурация градиента |
color-stop | цветовой стоп |
color-hint | интерполяционная точка |
Операторы
| Токен | Значение |
|---|---|
^ | начало паттерна |
. | конец паттерна |
[] | упорядоченная последовательность |
() | группировка |
| ` | ` |
~ | повторение (0..n) |
, | разделитель последовательности |
📌 Правила
1. Паттерн должен иметь начало и конец
^ ... .Валидный:
^color-stop.Невалидный:
color-stop2. Последовательность задаётся явно
[config,color-stop]Order matters.
Невалидный:
color-stop, config3. Нет неявной последовательности
Невалидный:
^(config|color-stop)~color-stop.Валидный:
^[(config|color-stop),~color-stop].4. Логика ИЛИ
(config|color-stop)Означает:
config или color-stop5. Repetition
~color-stopОзначает:
0..n color-stopПример:
^[color-stop,~color-stop].6. Группа
([color-hint,color-stop]|color-stop)Означает:
- последовательность из
color-hint, color-stop - или
color-stop
🧪 Примеры
Один стоп
^color-stop.Два стопа
^[color-stop,color-stop].Любое количество стопов
^[color-stop,~color-stop].С конфигом
^[([config,color-stop]|color-stop),~color-stop].С color hints
^[color-stop,~([color-hint,color-stop]|color-stop)].🎯 Рекомендованный паттерн по умолчанию
^[([config,color-stop,([color-hint,color-stop]|color-stop)]|color-stop),~([color-hint,color-stop]|color-stop)].Это обеспечивает:
- конфиг валидный только если даллее идут стопы
- color-hints всегда чередуются с color-stops
- стуктура строга типизирована
❌ Частые ошибки
Забытая последовательность
(config|color-stop)~color-stop ❌Неправильная позиция ИЛИ
[color-stop|color-stop] ❌Правильно:
(color-stop|color-stop)Одиночный color-hint
color-stop, color-hint ❌🧠 Ментальная модель
DSL можно рассматривать как:
программу, которая обрабатывает входные данные шаг за шагом
Он работает так:
patternIndex + inputIndex → next state🔍 Визуализация
Паттерн:
^[color-stop,~color-stop].Структура:
BEGIN
BEGIN SEQUENCE
color-stop
REPEAT color-stop N times
END SEQUENCE
END📌 Итог
- DSL описывает структуру, а не значения
- явный синтаксис, без неявного поведения
- строгие правила валидации
- небольшой, но выразительный язык
🚀 Что это даёт
- переиспользуемую валидацию градиентов
- кастомные типы градиентов
- предсказуемое поведение парсинга