pub struct Template(/* private fields */);
Expand description
A simple template which supports spec branches and variables.
The template is designed so that without expanding the template, it is still a valid TOML file.
§Spec Branches
A spec branches block replaces a line with a branch matching the given spec name.
The block starts with the line ending with # {{
(the leading space is required) and ends
with a line # }}
.
Between the start and end markers, every line is a branch starting with # SPEC => CONTENT
, where
SPEC
is the branch spec name, and CONTENT
is the text to be replaced for the spec.
A special spec name _
acts as a wildcard which matches any spec name.
The spec name is required to render the template, see Template::new
. The block including
the whole starting line which ends with # {{
will be replaced by the branch CONTENT
which SPEC
is _
or equals to the given spec name.
In the CONTENT
, variables are expanded and all the escape sequences \n
are replaced by new
lines.
use ckb_resource::{Template, TemplateContext};
let template = Template::new(
r#"filter = "debug" # {{
# mainnet => filter = "error"
# _ => filter = "info"
# }}"#
.to_string(),
);
let mainnet_result = template.render(&TemplateContext::new("mainnet", Vec::new()));
assert_eq!("filter = \"error\"\n", mainnet_result.unwrap());
let testnet_result = template.render(&TemplateContext::new("testnet", Vec::new()));
assert_eq!("filter = \"info\"\n", testnet_result.unwrap());
§Template Variables
Template variables are defined as key value dictionary in TemplateContext
via
TemplateContext::new
or TemplateContext::insert
.
Template uses variables by surrounding the variable names with curly brackets.
The variables expansions only happen inside the spec branches in the spec CONTENT
.
It is a trick to use a wildcard branch as in the following example.
use ckb_resource::{Template, TemplateContext};
let template = Template::new(
r#"# # {{
# _ => listen_address = "127.0.0.1:{rpc_port}"
# }}"#
.to_string(),
);
let text = template.render(&TemplateContext::new("dev", vec![("rpc_port", "18114")]));
assert_eq!("listen_address = \"127.0.0.1:18114\"\n", text.unwrap());