Shell-like variable substitution for strings and byte strings.
&str
or in &[u8]
."Hello $name!"
"Hello ${name}!"
"Hello ${name:person}!"
"${XDG_CONFIG_HOME:$HOME/.config}/my-app/config.toml"
toml
or yaml
feature).Variable names can consist of alphanumeric characters and underscores. They are allowed to start with numbers.
If you want to quickly perform substitution on a string, use substitute()
or substitute_bytes()
.
It is also possible to use one of the template types. The templates parse the source string or bytes once, and can be expanded as many times as you want. There are four different template types to choose from:
Template
: borrows the source string.TemplateBuf
: owns the source string.ByteTemplate
: borrows the source bytes.ByteTemplateBuf
: owns the source bytes.The [substitute()
][substitute] function can be used to perform substitution on a &str
.
The variables can either be a HashMap
or a BTreeMap
.
let mut variables = HashMap::new();
variables.insert("name", "world");
assert_eq!(subst::substitute("Hello $name!", &variables)?, "Hello world!");
The variables can also be taken directly from the environment with the Env
map.
assert_eq!(
subst::substitute("$XDG_CONFIG_HOME/my-app/config.toml", &subst::Env)?,
"/home/user/.config/my-app/config.toml",
);
Substitution can also be done on byte strings using the [substitute_bytes()
][substitute_bytes] function.
let mut variables = HashMap::new();
variables.insert("name", b"world");
assert_eq!(subst::substitute_bytes(b"Hello $name!", &variables)?, b"Hello world!");
You can also parse a template once and expand it multiple times:
let mut variables = HashMap::new();
let template = subst::Template::from_str("Welcome to our hair salon, $name!")?;
for name in ["Scrappy", "Coco"] {
variables.insert("name", name);
let message = template.expand(&variables)?;
println!("{}", message);
}