Expand description
§Oxiplate
Oxiplate is an experimental compile-time template system for Rust with a focus on helpful error messages, escaping, and whitespace control. Use at your own risk.
§Using Oxiplate in your project
§Hacking on Oxiplate
§Helpful error messages
Position information is tracked across files and passed onto Rust. This results in debuggable error messages even when issues are caught by Rust instead of Oxiplate.
<h1>{{ title }}</h1>
<p>{{ messages }}</p>use oxiplate::{Oxiplate, Render};
#[derive(Oxiplate)]
#[oxiplate = "external.html.oxip"]
struct HelloWorld {
title: &'static str,
message: &'static str,
}
let hello_world = HelloWorld {
title: "Hello world",
};
print!("{}", hello_world.render()?);
Ok::<(), ::core::fmt::Error>(())error[E0609]: no field `messages` on type `&HelloWorld`
--> /templates/external.html.oxip:2:7
|
2 | <p>{{ messages }}</p>
| ^^^^^^^^ unknown field
|
help: a field with a similar name exists
|
2 - <p>{{ messages }}</p>
2 + <p>{{ message }}</p>
|Check out the broken tests directory of
oxiplate and
oxiplate-derive
for (tested) example error messages.
§Escaping
Escaping is arguably the most important feature of a template system. The escaper name appears first to make it easier to spot, and always runs last to ensure the output is always safe. Creating templates in a language not supported by Oxiplate? You can add your own escapers!
<!-- Profile link for {{ comment: name }} -->
<a href="{{ attr: url }}">{{ text: name }}</a>use oxiplate::{Oxiplate, Render};
#[derive(Oxiplate)]
#[oxiplate = "external.html.oxip"]
struct ProfileLink {
url: &'static str,
name: &'static str,
}
let profile_link = ProfileLink {
url: r#""><script>alert("hacked!");</script>"#,
name: r#"<!-- --><script>alert("hacked!");</script><!-- -->"#
};
print!("{}", profile_link.render()?);
Ok::<(), ::core::fmt::Error>(())<!-- Profile link for ‹ǃ−− −−›‹script›alert("hackedǃ");‹/script›‹ǃ−− −−› -->
<a href=""><script>alert("hacked!");</script>"><!-- --><script>alert("hacked!");</script><!-- --></a>Read the full escaping chapter for more information.
§Whitespace control
Oxiplate supports removing trailing/leading/surrounding whitespace, or even collapsing it down to a single space.
{# Say hi and bye -#}
<a href="#">{-}
Hello {{ name -}}
</a>{_}
<a href="#">{-}
Goodbye
{{_ name -}}
</a><a href="#">Hello Bell</a> <a href="#">Goodbye Bell</a>Read the full whitespace control chapter for more information.
Modules§
- escapers
- Built-in escapers.
- filters
- Built-in filters.
- prelude
- Default Oxiplate experience that uses only built-in filters.
Structs§
- CowStr
Wrapper - Struct used in generated templates
that is intended to be passed to filters asking for
CowStrthat will immediately extract the containedCow<str>. - ToCow
StrWrapper - Wrapper around text
that will implement
CowStrviaFastCowStrwhen possible, otherwise via::std::fmt::Display. Must borrow twice before callingto_cow_str(). - Unescaped
Text Wrapper - Wrapper around unescaped text
that will implement
UnescapedTextviaFastEscapewhen possible, otherwise viaDisplay. Must borrow twice before callingoxiplate_escape()oroxiplate_raw().
Traits§
- CowStr
- A trait intended to be used by filters for any string-like arguments
to deal with them more efficiently than
strorimpl Display. Any expression or filter prefixed by>in a template will convert the value toCowStrWrapperwhich implements this trait. - Escaper
- Trait for an Oxiplate-compatible escaper group.
- Fast
CowStr - Trait that allows for more efficient conversions to
&str. - Fast
Escape - Trait that allows for more efficient conversions to
&str. - Render
- Optimized render function trait.
- ToCow
Str - Trait with a specialized implementation
for items that implement
FastCowStr, a trait that allows for more efficient conversions toCow<'a, str>. - Unescaped
Text - Trait with a specialized implementation
for items that implement
FastEscape, a trait that allows for more efficient conversions to&str.
Derive Macros§
- Oxiplate
- Derives the
::std::fmt::Displayimplementation for a template’s struct.