vy 0.2.0

A convenient and type-safe HTML templating library.
Documentation
#![doc = include_str!("../README.md")]

extern crate self as vy;

pub mod prelude {
    pub use vy_core::{either::*, escape::PreEscaped, *};
    pub use vy_macros::*;

    pub use crate::DOCTYPE;
}

pub use vy_core::{either::*, escape::PreEscaped, *};
pub use vy_macros::*;

pub const DOCTYPE: PreEscaped<&'static str> = PreEscaped("<!DOCTYPE html>");

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn empty_single_tags() {
        assert_eq!(a!().into_string(), "<a></a>");
        assert_eq!(header!().into_string(), "<header></header>");
        assert_eq!(fieldset!().into_string(), "<fieldset></fieldset>");
        assert_eq!(div!().into_string(), "<div></div>");
        assert_eq!(footer!().into_string(), "<footer></footer>");
        assert_eq!(h1!().into_string(), "<h1></h1>");
    }

    #[test]
    fn empty_multi_tags() {
        assert_eq!((a!(), header!()).into_string(), "<a></a><header></header>");
        assert_eq!(
            (div!(), span!(), span!(), span!(), div!()).into_string(),
            "<div></div><span></span><span></span><span></span><div></div>"
        );
    }

    #[test]
    fn nested_single_tags() {
        assert_eq!(div!(span!()).into_string(), "<div><span></span></div>");
        assert_eq!(span!(h1!()).into_string(), "<span><h1></h1></span>");
        assert_eq!(
            html!(body!(div!())).into_string(),
            "<html><body><div></div></body></html>"
        );
        assert_eq!(
            div!(div!(div!(div!(span!(div!()))))).into_string(),
            "<div><div><div><div><span><div></div></span></div></div></div></\
             div>"
        );
    }

    #[test]
    fn nested_multi_tags() {
        assert_eq!(
            html!(head!(title!()), body!(div!(div!(div!()), div!(span!()))))
                .into_string(),
            "<html><head><title></title></head><body><div><div><div></div></\
             div><div><span></span></div></div></body></html>"
        );
    }

    #[test]
    fn void_tags() {
        assert_eq!(area!().into_string(), "<area>");
        assert_eq!(base!().into_string(), "<base>");
        assert_eq!(br!().into_string(), "<br>");
        assert_eq!(col!().into_string(), "<col>");
        assert_eq!(embed!().into_string(), "<embed>");
        assert_eq!(hr!().into_string(), "<hr>");
        assert_eq!(img!().into_string(), "<img>");
        assert_eq!(input!().into_string(), "<input>");
        assert_eq!(link!().into_string(), "<link>");
        assert_eq!(meta!().into_string(), "<meta>");
        assert_eq!(source!().into_string(), "<source>");
        assert_eq!(track!().into_string(), "<track>");
        assert_eq!(wbr!().into_string(), "<wbr>");
    }

    #[test]
    fn attributes() {
        assert_eq!(
            div!(class = "foo bar", id = "baz").into_string(),
            "<div class=\"foo bar\" id=\"baz\"></div>"
        );
    }
}