by Stebalien

Stebalien / horrorshow-rs

A macro-based html builder for rust

208 Stars 14 Forks Last release: Not found Other 221 Commits 13 Releases

Available items

No Items, yet!

The developer of this repository has not created any items for sale yet. Need a bug fixed? Help with integration? A different license? Create a request here:


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

(disable the "std" feature) and even without
(disable the "alloc" feature).

When compiled with

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

When compiled with just core:

  • RenderBox
    is no longer defined (no allocation).
  • The
    are no longer defined. The only template rendering method available is
  • Templates may only emit static
    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

" } p { // Insert raw text (unescaped) : Raw("Let's count 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 = "\
    <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>\
assert_eq!(expected, actual);


We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.