handlebars-rust
Rust templating with Handlebars.
Thanks to @blaenk's patch, handlebars-rust now compiles on nightly, beta and stable (1.4.0+) channel.
Documents
Usage
Check examples in the source. The example shows you how to:
- Create a
Handlebars
and register the template from files - Create a custom Helper with closure or struct implementing
HelperDef
, and register it - Render something
Run cargo run --example render
to see results.
(or RUST_LOG=handlebars=info cargo run --example render
for logging output).
Checkout examples/
for more concrete demos of current API.
From 0.13, you can use either rustc_serialize
or serde
for your
data type. By default we use ToJson
from rustc_serialize
to
convert your data into handlebars internal types. If you use serde
framework in your project, you can enable serde_type
feature of this
crate and we will use Serialize
from serde
to convert.
Why Handlebars?
For information about handlebars, you will go to handlebars.js.
It's my favorite templating tool by far. I used it in Delicious.com as javascript-side template in 2013. Also I maintained a Clojure wrapper for Handlebars.java, hbs. And you may notice the close relationship between Ember.js and Rust community, handlebars is the default templating language of Ember.js framework, which powers crates.io.
Reasons I prefer Handlebars:
- Never ruin your Rust with HTML
- Never ruin your HTML with Rust
- Templating without a reuse mechanism is shit
- Templating without customization is nothing but shit
Handlebars provides:
- Separation of Rust and HTML
- A few control structures makes templating easier
- Few control structures stops you to put logic into templates
- Template reuse with include(
>
),partial
andblock
- Customize template behavior with helpers
Limitations:
- As a static typed language, it's a little verbose to use handlebars
- You will have to make your data
ToJson
-able, so we can render it. If you are on nightly channel, we have a syntax extension to generate defaultToJson
implementation for you. If you use serde, you can enableserde_type
feature of handlebars-rust and add#[Serialize]
for your types.
Handlebars-js features supported in Handlebars-rust
- Expression / Block Helpers
- Built-in helpers
- Customizing helper
- Parameter and hashes for helper
- Partials, include
- Omitting whitespace with
~
- Subexpression
{{(foo bar)}}
- Json expression
a.b.[0]
anda.b.[c]
Feel free to report an issue if you find something broken. We aren't going to implement all features of handlebars-js, but we should have a workaround for cases we don't support.
Handlebars for Iron
I have started another project handlebars-iron for the Iron web framework.
Break Change Log
No doubt that we will try our best to keep API compatible in each release. But sometime we have to bring in break changes to improve the design when worthy.
- 0.10.0:
renderw
now accepts&Context
instead ofToJson
to avoid unnecessary clone in batch rendering. 90274e7
License
MIT, of course.