markup 0.3.1

A blazing fast, type-safe template engine for Rust.
Documentation
mod e0 {
    markup::define! {
        Hello {
            "Hello,"
            " "
            "world!\n"
            {1 + 2}
            {'π'}
            {format!("{}{}", 3, 4)}
            {if true { Some(5) } else { None }}
            {if false { Some(6) } else { None }}
        }
    }
}

mod e1 {
    markup::define! {
        Hello {
            div {}
            br;
        }
    }
}

mod e2 {
    markup::define! {
        Hello {
            .foo {
                .bar {}
            }
            button#go.button."button-blue" {}
            button#"go-back".{1 + 2}.{2 + 3} {}
        }
    }
}

mod e3 {
    markup::define! {
        Hello {
            div[
                a = 1,
                b = "2",
                c? = true,
                d? = false,
                "e-f" = 3,
                {"g".to_string() + "-h"} = 4,
                i = None::<i32>,
                j = Some(5)
            ] {}
            "\n"
            br[k = 6];
            "\n"
            input[type = "text"];
        }
    }
}

mod e4 {
    markup::define! {
        Hello {
            .foo[a = 1] {
                "One"
                {0 + 1}
            }
            div {
                "Two"
                {1 + 1}
            }
        }
    }
}

mod e5 {
    markup::define! {
        Hello {
            "<&\">"
            {markup::raw("<span></span>")}
        }
    }
}

mod e6 {
    markup::define! {
        Hello(foo: u32, bar: u32, string: String) {
            div {
                {foo + bar}
                {string}
            }
        }
    }
}

mod e7 {
    markup::define! {
        Hello<'a, T: std::fmt::Debug, U>(arg: T, arg2: U, str: &'a str) where U: std::fmt::Display {
            div {
                {format!("{:?}", arg)}
                {format!("{}", arg2)}
                {str}
            }
        }
    }
}

mod e8 {
    markup::define! {
        Add(a: u32, b: u32) {
            span { {a + b} }
        }
        Hello {
            {Add { a: 1, b: 2 }}
            {Add { a: 3, b: 4 }}
        }
    }
}

mod e9 {
    markup::define! {
        Classify(value: i32) {
            {value}
            " is "
            @if *value < 0 {
                "negative"
            } else if *value == 0 {
                "zero"
            } else {
                "positive"
            }
            ".\n"
        }
        Main {
            {Classify { value: -42 }}
            " "
            {Classify { value: 0 }}
            " "
            {Classify { value: 42 }}
        }
    }
}

mod e10 {
    markup::define! {
        Classify(value: Option<i32>) {
            @if let Some(0) = *(value) {
                "Some(ZERO)"
            } else if let Some(value) = *(value) {
                "Some(" {value} ")"
            } else {
                "None"
            }
            "\n"
        }
        Main {
            {Classify { value: None }}
            {Classify { value: Some(0) }}
            {Classify { value: Some(1) }}
        }
    }
}

mod e11 {
    markup::define! {
        Main {
            @for i in 1..5 {
                {i} " * 2 = " {i * 2} ";\n"
            }
        }
    }
}

mod e12 {
    markup::define! {
        Main {
            {let x = 1;}
            {fn add1(x: i32) -> i32 {
                x + 1
            }}
            {add1(x)}
        }
    }
}

fn main() {
    println!("{}\n", e0::Hello {});
    println!("{}\n", e1::Hello {});
    println!("{}\n", e2::Hello {});
    println!("{}\n", e3::Hello {});
    println!("{}\n", e4::Hello {});
    println!("{}\n", e5::Hello {});
    println!(
        "{}\n",
        e6::Hello {
            foo: 1,
            bar: 2,
            string: String::from("hello")
        }
    );
    println!(
        "{}\n",
        e7::Hello {
            arg: (1, 2),
            arg2: "arg2",
            str: "str"
        }
    );
    println!("{}\n", e8::Hello {});
    println!("{}\n", e9::Main {});
    println!("{}\n", e10::Main {});
    println!("{}\n", e11::Main {});
    println!("{}\n", e12::Main {});
}