Module ructe::Template_syntax
source · Expand description
This module describes the template syntax used by ructe.
The syntax is inspired by Twirl, the Scala-based template engine in Play framework, but of course with rust types expressions instead of scala.
A template consists of three basic parts:
First a preamble of use
statements, each prepended by an @ sign.
Secondly a declaration of the parameters the template takes.
And third, the template body.
@(name: &str, value: &u32)
<html>
<head><title>@name</title></head>
<body>
<p>The value of @name is @value.</p>
<body>
</html>
As seen above, string slices and integers can easily be outputed
in the template body, using @name
where name
is a parameter of
the template.
Actually, more complex expressions can be outputed in the same
way, as long as the resulting value implements ToHtml
.
Rust types that implements Display
automatically implements
ToHtml
in such a way that contents are safely escaped for
html.
@use any::rust::Type;
@(name: &str, items: &[Type])
<html>
<head><title>@name</title></head>
<body>
@if items.is_empty() {
<p>There are no items.</p>
} else {
<p>There are @items.len() items.</p>
<ul>
@for item in items {
<li>@item</li>
}
</ul>
<body>
</html>
The curly brackets, {
and }
, is used for blocks (see Loops,
Conditionals, and Calling other templates below).
To use verbatim curly brackets in the template body, they must be
escaped as @{
and @}
, the same goes for the @
sign, that
precedes expressions and special blocks; verbtim @
signs must be
escaped as @@
.
Modules
- A value expression can be as simple as
@name
to get the value of a parameter, but more complicated expressions, including function calls, are also allowed. - A ructe
@for
loop works just as a rustfor
loop, iterating over anything that implementsstd::iter::IntoIterator
, such as aVec
or a slice. - Both
@if
statements with boolean expressions,@if let
guard statements, and@match
statements are supported. - The ability to call other templates for from a template makes both “tag libraries” and “base templates” possible with the same syntax.