damask
React-подобные компоненты для Rust, шаблоны которых исчезают при компиляции.
React-подобные компоненты для Rust, полностью разрешаемые на этапе сборки.
Компонент — это структура (её поля и есть пропсы) в паре с HTML-шаблоном на
теговом синтаксисе { … }. Дерайв Component находит файл .dmk, лежащий
рядом со структурой, и компилирует его в метод render — так что выполняется
обычный Rust, экономный на аллокациях: ни шаблонизатора, ни разбора, ничего не
нужно загружать при старте. Никакого build.rs и никакой настройки;
правка шаблона пересобирает крейт.
Интереснее всего то, что здесь ловит компилятор. Теги с заглавной буквы
— это компоненты, и атрибут, которого не объявляет ни одно поле, роняет сборку
с указанием на него: опечатка в пропсе не отрендерится тихо в страницу.
Значения атрибутов типизированы, а не превращены в строки: bool пишет голый
disabled или не пишет ничего, Option при None не пишет ничего — потому
что в HTML контрол выключает само наличие атрибута. {@tokens} собирает одно
значение из многих частей, {@attrs} разворачивается в набор пар data-* или
aria-*, а {...expr} подмешивает атрибуты, которых компонент не называет.
Слоты — та же пара, что у веб-компонентов: <slot/> размещает, slot="…"
заполняет — и живут вне структуры, так что шаблон объявляет их сколько угодно,
не меняя тип; <slot>, написанный на месте заполнения, пробрасывает его
дальше. Сниппеты — переиспользуемые фрагменты с параметрами, то есть
render-props. А .await в любом месте, где шаблон держит Rust, компилирует
компонент в асинхронный путь рендеринга — это решается по самому шаблону и
ничего не стоит тому, кто не ждёт. Future рендеринга — Send, так что его
можно дождаться прямо в обработчике запроса.
Рядом с крейтом: языковой сервер с диагностиками и автодополнением, расширение для Zed и грамматика Tree-sitter, которой подсвечивается сайт документации — поэтому сниппет на странице выглядит так же, как в редакторе.
Rust, MIT, на crates.io: cargo add damask, языковой сервер —
cargo install damask-lsp.