| Crates.io | interpolator |
| lib.rs | interpolator |
| version | 0.5.0 |
| created_at | 2023-02-27 14:59:57.291889+00 |
| updated_at | 2023-04-17 21:10:08.895718+00 |
| description | runtime format strings, fully compatible with std's macros |
| homepage | |
| repository | https://github.com/ModProg/interpolator |
| max_upload_size | |
| id | 796096 |
| size | 265,823 |
Runtime implementation of format!.
formatRuntime version of format!.
Takes a string and a context, containing Formattable values, returns a
string.
use std::collections::HashMap;
use template::{format, Formattable};
let formatted = format(
"{value:+05}", // could be dynamic
&[("value", Formattable::display(&12))].into_iter().collect::<HashMap<_,_>>(),
)
.unwrap();
assert_eq!(formatted, format!("{:+05}", 12));
writeRuntime version of write!.
Takes a mutable Write e.g. &mut String, a format string and a context,
containing Formattable values.
use std::collections::HashMap;
use template::{write, Formattable};
let mut buf = String::new();
write(
&mut buf,
"{value:+05}", // could be dynamic
&[("value", Formattable::display(&12))].into_iter().collect::<HashMap<_,_>>(),
)
.unwrap();
assert_eq!(buf, format!("{:+05}", 12));
i iter formatThe feature iter enables an additional format trait i, it allows to
format a list of values with a format string and an optional join
expression.
The syntax is {list:i(the format string, '{}' is the array element)(the join)}, an empty join can also be omitted {list:i({})}. If join is omitted
the format string {} can be omitted as well {list:i}.
Should you need to use ) inside your format string or join, you can add #
similar to rust's raw string
(i.e. #(({}))#).
It is also possible to only iterate a sub-slice specified through a range
before the format string, i.e. {list:i1..4}. For open ranges range
bounds can also be omitted. To index from the end, you can use negative
range bounds.
It is also possible to index a single value by only specifying an isize
{list:i1}.
A Formattable implementing iter is created using Formattable::iter:
// HashMap macro
use collection_literals::hash;
use interpolator::{format, Formattable};
// Needs to be a slice of references because `Formattable::display` expects a
// reference
let items = [&"hello", &"hi", &"hey"].map(Formattable::display);
let items = Formattable::iter(&items);
let format_str = "Greetings: {items:i..-1(`{it}`)(, )} and {items:i-1..(`{it}`)}";
assert_eq!(
format(format_str, &hash!("items" => items))?,
"Greetings: `hello`, `hi` and `hey`"
);
# return Ok::<(), interpolator::Error>(())
By default only Display is supported, the rest of the
formatting traits
can be enabled through the following features.
debug enables ?, x? and X? trait specifiersnumber enables x, X, b, o, e and E trait specifierspointer enables p trait specifiersiter enables i trait specifier