bart 0.1.7

Compile time templating inspired by Mustache
Documentation
use bart_derive::BartDisplay;

#[test]
fn it_supports_conditional_scope_with_boolean() {
    #[derive(BartDisplay)]
    #[template_string = "{{#a?}}yes{{/a}}"]
    struct Test {
        a: bool,
    }

    assert_eq!("yes", Test { a: true }.to_string());

    assert_eq!("", Test { a: false }.to_string());
}

#[test]
fn it_supports_negative_conditional_scope_with_boolean() {
    #[derive(BartDisplay)]
    #[template_string = "{{^a?}}no{{/a}}"]
    struct Test {
        a: bool,
    }

    assert_eq!("", Test { a: true }.to_string());

    assert_eq!("no", Test { a: false }.to_string());
}

#[test]
fn it_supports_conditional_scope_with_non_bool() {
    struct TestBool<'a> {
        name: &'a str,
    }

    impl<'a> bart::Conditional for TestBool<'a> {
        fn val(&self) -> bool {
            self.name.len() > 2
        }
    }

    #[derive(BartDisplay)]
    #[template_string = "{{cond.name}}: {{#cond?}}Hello {{.name}}{{/cond}}"]
    struct Test<'a> {
        cond: TestBool<'a>,
    }

    assert_eq!(
        "Joe: Hello Joe",
        Test {
            cond: TestBool { name: "Joe" }
        }
        .to_string()
    );

    assert_eq!(
        "No: ",
        Test {
            cond: TestBool { name: "No" }
        }
        .to_string()
    );
}

#[test]
fn it_supports_conditional_scope_with_vec() {
    #[derive(BartDisplay)]
    #[template_string = "{{#a?}}yes{{/a}}"]
    struct Test {
        a: Vec<i32>,
    }

    assert_eq!("yes", Test { a: vec![1] }.to_string());

    assert_eq!("", Test { a: vec![] }.to_string());
}

#[test]
fn it_supports_conditional_scope_with_borrowed_vec() {
    #[derive(BartDisplay)]
    #[template_string = "{{#a?}}yes{{/a}}"]
    struct Test<'a> {
        a: &'a Vec<i32>,
    }

    assert_eq!("yes", Test { a: &vec![1, 2, 3] }.to_string());

    assert_eq!("", Test { a: &vec![] }.to_string());
}

#[test]
fn it_supports_conditional_scope_with_slice() {
    #[derive(BartDisplay)]
    #[template_string = "{{#a?}}yes{{/a}}"]
    struct Test<'a> {
        a: &'a [i32],
    }

    assert_eq!("yes", Test { a: &[1] }.to_string());

    assert_eq!("", Test { a: &[] }.to_string());
}

#[test]
fn it_supports_conditional_scope_with_function() {
    #[derive(BartDisplay)]
    #[template_string = "{{#gt()?}}yes{{/gt()}}"]
    struct Test {
        a: i32,
    }

    impl Test {
        pub fn gt(&self) -> bool {
            self.a > 10
        }
    }

    assert_eq!("yes", Test { a: 20 }.to_string());

    assert_eq!("", Test { a: 5 }.to_string());
}