damask

React-подобные компоненты для Rust, шаблоны которых исчезают при компиляции.

Знак Damask — четырёхлепестковый квадрифолий, нарисованный мареновым красным внутри скруглённого квадрата, на тёмном фоне с еле заметным тканым узором

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.