#template #templating #traits #formatting #once #data

funcfmt

"Parse once, populate many" templating using function traits

3 releases (breaking)

0.3.0 Apr 25, 2023
0.2.0 Apr 3, 2023
0.1.0 Apr 3, 2023

#253 in Template engine

Download history 19/week @ 2024-03-11 7/week @ 2024-03-18 16/week @ 2024-03-25 72/week @ 2024-04-01 5/week @ 2024-04-08 4/week @ 2024-04-15 10/week @ 2024-04-22 1/week @ 2024-04-29 9/week @ 2024-05-06 23/week @ 2024-05-13 27/week @ 2024-05-20 7/week @ 2024-05-27 7/week @ 2024-06-03 14/week @ 2024-06-10 5/week @ 2024-06-17 35/week @ 2024-06-24

62 downloads per month
Used in 3 crates

MIT license

16KB
245 lines

funcfmt | Tests

funcfmt is a simple, lightweight templating library that allows templating using custom runtime context and function traits. It was originally created for exifrename, to allow efficiently processing a format and set of callbacks across thousands of EXIF objects.

Documentation

Documentation is available on docs.rs, or through cargo doc --open.

Usage

To add funcfmt to your dependencies:

cargo add funcfmt

The basic flow of funcfmt looks like this:

  1. Given a FormatMap<T> called formatters, call formatters.to_format_pieces(), which preprocesses everything into a FormatPieces<T>, where &T is what your callback function will take as its only argument. This allows avoiding having to reparse the formatters and go through the template each time things are processed.
  2. Call .render(data) on the FormatPieces<T>.

A very small example with Strings passed in, although you can pass an object of any type:

use funcfmt::{fm, FormatMap, Render, ToFormatPieces};

fn main() {
    let formatters = FormatMap::from([
        fm!("foo", |data| Some(format!("foo: {data}"))),
        fm!("bar", |data| Some(format!("bar: {data}"))),
        fm!("baz", |data| Some(format!("baz: {data}"))),
    ]);

    let fp = formatters.to_format_pieces("{foo}, {bar}").unwrap();

    // foo: some data, bar: some data
    let data_one = String::from("some data");
    println!("{}", fp.render(&data_one).unwrap());

    // foo: other data, bar: other data
    // note that this doesn't require processing the format again
    let data_two = String::from("other data");
    println!("{}", fp.render(&data_two).unwrap());
}

Dependencies

~0.5–1MB
~21K SLoC