Control structures

Maud provides various control structures for adding dynamic elements to your templates.

Branching with @if and @else

Use @if and @else to branch on a boolean expression. As with Rust, braces are mandatory and the @else clause is optional.

#[derive(PartialEq)]
enum Princess { Celestia, Luna, Cadance, TwilightSparkle }

let user = Princess::Celestia;

html! {
    @if user == Princess::Luna {
        h1 "Super secret woona to-do list"
        ul {
            li "Nuke the Crystal Empire"
            li "Kick a puppy"
            li "Evil laugh"
        }
    } @else if user == Princess::Celestia {
        p "Sister, please stop reading my diary. It's rude."
    } @else {
        p "Nothing to see here; move along."
    }
}

@if let is supported as well. It works as you'd expect:

let user = Some("Pinkie Pie");
html! {
    p {
        "Hello, "
        @if let Some(name) = user {
            (name)
        } @else {
            "stranger"
        }
        "!"
    }
}

Looping with @for

Use @for .. in .. to loop over the elements of an iterator.

let names = ["Applejack", "Rarity", "Fluttershy"];
html! {
    p "My favorite ponies are:"
    ol {
        @for name in &names {
            li (name)
        }
    }
}

Declaring variables with @let

Declare a new variable within a template using @let. This can be useful when working with values in a for loop.

let names = ["Applejack", "Rarity", "Fluttershy"];
html! {
    @for name in &names {
        @let first_letter = name.chars().next().unwrap();
        p {
            "The first letter of "
            b (name)
            " is "
            b (first_letter)
            "."
        }
    }
}

Matching with @match

Pattern matching is supported with @match.

enum Princess { Celestia, Luna, Cadance, TwilightSparkle }

let user = Princess::Celestia;

html! {
    @match user {
        Princess::Luna => {
            h1 "Super secret woona to-do list"
            ul {
                li "Nuke the Crystal Empire"
                li "Kick a puppy"
                li "Evil laugh"
            }
        },
        Princess::Celestia => {
            p "Sister, please stop reading my diary. It's rude."
        },
        _ => p "Nothing to see here; move along."
    }
}

results matching ""

    No results matching ""