4 releases

0.1.3 Nov 17, 2020
0.1.2 Nov 13, 2020
0.1.1 Nov 12, 2020
0.1.0 Nov 12, 2020

#353 in Template engine

MIT/Apache

16KB
185 lines

terender - Render tera templates from data files

terender is a simple command-line tool for rendering template files in tera template format simply using structured input data from a file.

Currently supported file formats for the structured data are JSON, TOML and YAML. It does detect these only based on the file name extension, no inspection of the contents is done. For now, the file extension must be lowercase. Once rust-lang #70516 is in the stable compiler, I will use that to make the detection case-insensitive. If a file does contain data that can't be parsed, the tool will abort with an error message. If you're interested in adding a new format that is supported by serde, please either submit an issue or create a merge request.

For information on how to write tera templates, take a look at their documentation.

Usage

A short usage example for transforming from a simple markdown template file with some json data into the rendered markdown.

Contents of products.template.md:

# Our products
{% for category in categories %}
## {{ category.name }} ({{ category.articles | length }} articles)

{% for article in category.articles -%}
* {{ article }}
{% endfor -%}

{% endfor -%}

Contents of products.json:

{
    "categories": [
        {
            "name": "Sports",
            "articles": [
                "Training shoes",
                "Bicycle"
            ]
        },
        {
            "name": "Electronics",
            "articles": [
                "Mobile phone",
                "USB memory stick",
                "E-Book reader"
            ]
        },
        {
            "name": "Food",
            "articles": [
                "Cheese",
                "Apple",
                "Milk"
            ]
        }
    ]
}

Running terender:

$ terender products.template.md products.json
# Our products

## Sports (2 articles)

* Training shoes
* Bicycle

## Electronics (3 articles)

* Mobile phone
* USB memory stick
* E-Book reader

## Food (3 articles)

* Cheese
* Apple
* Milk
$

Installation

Prerequisites

You need a working installation of the rust development environment, namely rustc and cargo. These can either be obtained from your operating system if it provides it (e.g. apt install rustc on Debian-based operating systems), or through https://rustup.rs.

How to install

The typical command for installation is:

cargo install terender

If you already have a version of the tool installed and want to overwrite it, you need to add the -f parameter:

cargo install -f terender

Special cases

Top-level non-object in a file single data file

The tera template rendering is only capable of rendering entities that represent objects with named fields (e.g. JSON object, or YAML mmappings). If a data input file contains something else at top-level, such as an array / list / sequence, or a primitive type, that entity gets wrapped into an object containing a single field named data in order to allow processing of that input.

[
    "hello",
    "world"
]

would be changed to

{
    "data": [
        "hello",
        "world"
    ]
}

before processing.

Using multiple data files

In case you would like to use multiple data files in a rendering, you can do so. If you pass multiple data file parameters, these will be wrapped into a top-level object containing a data field which is an array enclosing all the data files.

If passing these two files to the process:

# This is file1.toml

[details]
version = "1.0"
{
    "information": "this is file2.json"
}

the data passed to the template would look like this (in JSON):

{
    "data": [
        {
            "details": {
                "version": "1.0"
            }
        },
        {
            "information": "this is file2.json"
        }
    ]
}

Technical details

This tool is just a very small implementation plumbing what already exists. The heavy lifting is done in library crates used by this tool:

It is all because of these excellent implementations that this crate can be short and easily implemented.

A note to package maintainers

If you'd like to package this tool for an operating system distribution, feel free to do so. I'd be happy if you inform me when doing so, but it's not mandatory.

If you would like to deploy shell completion scripts with your package, these can be generated by setting the TERENDER_GENERATE_SHELL_COMPLETIONS environment variable to a relative or absolute directory path where the completion files for all shells supported by clap are generated.

Changelog

Version 0.1.3

  • Allow using multiple data input files

Version 0.1.2

  • Add support for YAML data files
  • Add support for TOML data files

Version 0.1.1

  • Add support for processing toplevel non-object types by wrapping them into an object with a data field.

Version 0.1.0

  • Initial release

Dependencies

~11–21MB
~280K SLoC