# 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. ```rust #[derive(PartialEq)] enum Princess { Celestia, Luna, Cadance, TwilightSparkle } let user = Princess::Celestia; # let _ = maud:: 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: ```rust let user = Some("Pinkie Pie"); # let _ = maud:: 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. ```rust let names = ["Applejack", "Rarity", "Fluttershy"]; # let _ = maud:: 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. ```rust let names = ["Applejack", "Rarity", "Fluttershy"]; # let _ = maud:: 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`. ```rust enum Princess { Celestia, Luna, Cadance, TwilightSparkle } let user = Princess::Celestia; # let _ = maud:: 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." } } } # ; ```