string-template-plus 0.1.4

Render string template with more options
Documentation

Template with support for optional variables and such.

Introduction

This is a simple template tool that works with variable names and HashMap of String. The Template can be parsed from str and then you can render it using the variables in HashMap and any shell commands running through Exec.

Features

  • Parse the template from a str that's easy to write,
  • Support for alternatives in case some variables are not present, Use ? to separate the alternatives, uses whichever it can find first. If ? is at the end, leaves it blank instead of erroring out.
  • Support for literal strings inside the alternative options, You can use a literal string "string" enclosed in " as an alternative if you want to put something instead of blank at the end.
  • Support for the date time format using chrono, You can use any format starting with % inside the variable placeholder {} to use a date time format supported by chrono.
  • Support for any arbitrary commands, etc. You can keep any command inside $( and ) to run it and use the result in the template. You can use other format elements inside it.

Limitations

  • You cannot use positional arguments in this template system, only named ones.
  • I haven't tested variety of names, although they should work try to keep the names identifier friendly.
  • Currently doesn't have format specifiers, for now you can use the command options with printf bash command to format things the way you want. Like a template this is $(printf "%.2f" {weight}) kg. should be rendered with the correct float formatting.

Example

let templ = parse_template("hello {nickname?name}. You're $(printf \"%.1f\" {weight})kg").unwrap();
let mut vars: HashMap<String, String> = HashMap::new();
vars.insert("name".into(), "John".into());
vars.insert("weight".into(), "132.3423".into());
let rendered = templ
    .render(&RenderOptions {
        wd: PathBuf::from("."),
        variables: vars,
    })
    .unwrap();
assert_eq!(rendered, "hello John. You're 132.3kg");