#[derive(ComponentBuilder)]
{
// Attributes available to this derive:
#[builder]
#[slot]
}
Expand description
Derives a typed builder for a named component struct.
Required fields are plain fields unless they use Option<T>, Vec<T>, or #[builder(default)].
The builder exposes one setter per field, maybe_field(option) helpers for optional fields
using the field’s exact Option<T> type, and optional repeated-item setters from
#[builder(each = "item_name")]. Regular setters for fields written as Markup,
maud::Markup, or ::maud::Markup accept any maud::Render value.
Slot metadata can be declared with #[slot] and #[slot(default)] so the component contract
is explicit before higher-level composition sugar exists.
use maud::{Markup, Render, html};
use maud_extensions::ComponentBuilder;
#[derive(ComponentBuilder)]
struct Card<'a> {
title: &'a str,
#[slot(optional)]
header: Option<Markup>,
#[slot(default)]
body: Markup,
}
impl<'a> Render for Card<'a> {
fn render(&self) -> Markup {
html! {
article {
@if let Some(header) = &self.header {
header { (header) }
}
main { (self.body) }
}
}
}
}
fn view() -> Markup {
Card::new()
.title("Status")
.header(html! { h2 { "Live" } })
.body(html! { p { "All systems green" } })
.render()
}