Horrorshow Rs

A macro-based html builder for rust
Alternatives To Horrorshow Rs
Project NameStarsDownloadsRepos Using ThisPackages Using ThisMost Recent CommitTotal ReleasesLatest ReleaseOpen IssuesLicenseLanguage
Horrorshow Rs268301623 days ago29October 13, 20213apache-2.0Rust
A macro-based html builder for rust
Codegen14427102 years ago4May 09, 20209mitRust
A Rust library providing a builder API to generate Rust code.
5 years ago7November 08, 2017mitRust
Query builder (SQL) in Rust
Did Common Rust2
4 years ago6otherRust
A Rust library for working with Decentralized Identifiers (DIDs) following the DID specification by the W3C.
Alternatives To Horrorshow Rs
Select To Compare

Alternative Project Comparisons


Build Status Documentation crates.io

A macro-based html templating library, compatible with stable rust (currently requires rust >= 1.37).


This crate will degrade gracefully when compiled without std (disable the "std" feature) and even without alloc (disable the "alloc" feature).

When compiled with alloc but without std:

  • Template::write_to_io() is not defined.
  • Templates may only emit errors implementing ToString and all such errors are immediately converted to strings.

When compiled with just core:

  • RenderBox is no longer defined (no allocation).
  • The Template::into_string() and Template::write_to_string() are no longer defined. The only template rendering method available is Template::write_to_fmt().
  • Templates may only emit static &str errors, and only the first is recorded.


extern crate horrorshow;
use horrorshow::prelude::*;
use horrorshow::helper::doctype;

fn main() {
    let actual = format!("{}", html! {
        : doctype::HTML;
        html {
            head {
                title : "Hello world!";
            body {
                // attributes
                h1(id="heading") {
                    // Insert escaped text
                    : "Hello! This is <html />"
                p {
                    // Insert raw text (unescaped)
                    : Raw("Let's <i>count</i> to 10!")
                ol(id="count") {
                    // You can embed for loops, while loops, and if statements.
                    @ for i in 0..10 {
                        li(first? = (i == 0)) {
                            // Format some text.
                            : format_args!("{}", i+1)
                // You need semi-colons for tags without children.
                br; br;
                p {
                    // You can also embed closures.
                    |tmpl| {
                        tmpl << "Easy!";

    let expected = "\
    <!DOCTYPE html>\
        <title>Hello world!</title>\
        <h1 id=\"heading\">Hello! This is &lt;html /&gt;</h1>\
        <p>Let's <i>count</i> to 10!</p>\
        <ol id=\"count\">\
          <li first>1</li>\
        <br /><br />\
    assert_eq!(expected, actual);
Popular Builder Projects
Popular Rust Library Projects
Popular Build Tools Categories
Related Searches

Get A Weekly Email With Trending Projects For These Categories
No Spam. Unsubscribe easily at any time.
Error Reporting
Rust Library
Html Template