temply 0.3.0

Simple, opinionated template engine
Documentation
mod util;

use temply::Template;

#[test]
fn test_simple() {
    #[derive(Debug, Template)]
    #[dedent]
    #[template_inline = "Hello World!"]
    struct MyTemplate;

    assert_render!(MyTemplate, "Hello World!");
}

#[test]
fn test_scope() {
    #[derive(Debug, Template)]
    #[dedent]
    #[template_inline = r#"{% scope %}
    Hello World!
    1234
{% endscope %}"#]
    struct MyTemplate;

    assert_render!(MyTemplate, "Hello World!\n1234");
}

#[test]
fn test_scope_1() {
    #[derive(Debug, Template)]
    #[dedent]
    #[template_inline = r#"{% scope %}Hello World
    1234
{% endscope %}"#]
    struct MyTemplate;

    assert_render!(MyTemplate, "Hello World\n1234");
}

#[test]
fn test_scope_start_1() {
    #[derive(Debug, Template)]
    #[dedent]
    #[template_inline = r#"{% scope %}{{ self.0 }}
    1234
{% endscope %}"#]
    struct MyTemplate(u32);

    assert_render!(MyTemplate(42), "42\n1234");
}

#[test]
fn test_scope_start_2() {
    #[derive(Debug, Template)]
    #[dedent]
    #[template_inline = r#"{% scope %}{% if self.0 == 42 %}Hello{% endif %}
    1234
{% endscope %}"#]
    struct MyTemplate(u32);

    assert_render!(MyTemplate(42), "Hello\n1234");
}

#[test]
fn test_scope_no_dedent_inner() {
    #[derive(Debug, Template)]
    #[dedent]
    #[template_inline = r#"{% scope %}
{{ self.0 }}
    1234
{% endscope %}"#]
    struct MyTemplate(u32);

    assert_render!(MyTemplate(42), "42\n    1234");
}

#[test]
fn test_scope_no_dedent_end() {
    #[derive(Debug, Template)]
    #[dedent]
    #[template_inline = r#"{% scope %}
    {{ self.0 }}
    1234
abc{% endscope %}"#]
    struct MyTemplate(u32);

    assert_render!(MyTemplate(42), "42\n    1234\nabc");
}

#[test]
fn test_scope_nested() {
    #[derive(Debug, Template)]
    #[dedent]
    #[template_inline = r#"{% scope %}
    Hello World!
    {% scope %}
        xxxx
    {% endscope %}
    1234
{% endscope %}"#]
    struct MyTemplate;

    assert_render!(MyTemplate, "Hello World!\nxxxx\n1234");
}

#[test]
fn test_scope_nested_indented() {
    #[derive(Debug, Template)]
    #[dedent]
    #[template_inline = r#"{% scope %}
    Hello World!
        {% scope %}
            xxxx
            yyyy
        {% endscope %}
    1234
{% endscope %}"#]
    struct MyTemplate;

    assert_render!(MyTemplate, "Hello World!\n    xxxx\n    yyyy\n1234");
}

#[test]
fn test_for() {
    #[derive(Debug, Template)]
    #[dedent]
    #[template_inline = r#"{% for i in 0..4 %}
    {{ i }}
{% endfor %}"#]
    struct MyTemplate;

    assert_render!(MyTemplate, "0\n1\n2\n3");
}

#[test]
fn test_for_and_if_else() {
    #[derive(Debug, Template)]
    #[dedent]
    #[template_inline = r#"{% for i in 0..4 %}
    {% if i % 2 == 0 %}
        {{ i }}
                            {% else %}
                      -
    {% endif %}
{% endfor %}"#]
    struct MyTemplate;

    assert_render!(MyTemplate, "0\n-\n2\n-");
}

#[test]
fn test_for_and_text_and_if() {
    #[derive(Debug, Template)]
    #[dedent]
    #[template_inline = r#"{% for i in 0..4 %}
    {{ i }}{% if i != 3 %},{% endif %}
{% endfor %}"#]
    struct MyTemplate;

    assert_render!(MyTemplate, "0,\n1,\n2,\n3");
}

#[test]
fn test_match() {
    #[derive(Debug, Template)]
    #[dedent]
    #[template_inline = r#"{% match self.0 %}
    {% where Some(x) %}
        X = {{x}};
        ...
    {% endwhere %}
    {% where None %}
        no value
    {% endwhere %}
{% endmatch %}"#]
    struct MyTemplate(Option<i32>);

    assert_render!(MyTemplate(Some(42)), "X = 42;\n...");
    assert_render!(MyTemplate(None), "no value");
}

#[test]
fn test_match_indented() {
    #[derive(Debug, Template)]
    #[dedent]
    #[template_inline = r#"{% match self.0 %}
    {% where Some(x) %}
        X = {{x}};
            ...
    {% endwhere %}
    {% where None %}
        no value
    {% endwhere %}
{% endmatch %}"#]
    struct MyTemplate(Option<i32>);

    assert_render!(MyTemplate(Some(42)), "X = 42;\n    ...");
    assert_render!(MyTemplate(None), "no value");
}

#[test]
fn test_macro() {
    #[derive(Debug, Template)]
    #[dedent]
    #[template_inline = r#"
        {% macro render_expr |expr: &Expr| %}
            {% match expr %}
                {% where Expr::Add(a, b) %}
                    add(
                        {% call render_expr (&*a) %},
                        {% call render_expr (&*b) %}
                    )
                {% endwhere %}
                {% where Expr::Sign(a) %}
                    -(
                        {% call render_expr (&*a) %}
                    )
                {% endwhere %}
                {% where Expr::Num(n) %}
                    {{ n }}
                {% endwhere %}
            {% endmatch %}
        {% endmacro %}
Res: {
    {% call render_expr(&self.0) %}
}
"#]
    struct MyTemplate(Expr);

    #[derive(Debug)]
    enum Expr {
        Add(Box<Expr>, Box<Expr>),
        Sign(Box<Expr>),
        Num(u32),
    }

    assert_render!(
        MyTemplate(Expr::Add(
            Box::new(Expr::Sign(Box::new(Expr::Num(3)))),
            Box::new(Expr::Num(4))
        )),
        r#"
        
Res: {
    add(
        -(
            3
        ),
        4
    )
}
"#
    );
}