Skip to main content

ComponentBuilder

Derive Macro ComponentBuilder 

Source
#[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()
}