aboutsummaryrefslogtreecommitdiffstats
path: root/askama_shared/src/generator.rs
diff options
context:
space:
mode:
authorLibravatar Andrew Dona-Couch <hi@andrewcou.ch>2020-07-08 17:03:02 +0000
committerLibravatar Dirkjan Ochtman <dirkjan@ochtman.nl>2020-07-14 20:48:15 +0200
commit42c4cb1d877d696bb97aa2e9402429dad42d7d66 (patch)
tree81db4dfc1925a2a8cc4e99c42ae4cc003e60f9e5 /askama_shared/src/generator.rs
parent21fb60466c9bae2fac325f057da20d7143618412 (diff)
downloadaskama-42c4cb1d877d696bb97aa2e9402429dad42d7d66.tar.gz
askama-42c4cb1d877d696bb97aa2e9402429dad42d7d66.tar.bz2
askama-42c4cb1d877d696bb97aa2e9402429dad42d7d66.zip
Add fmt filter that swaps the first two arguments to format!().
This allows a more natural filter usage: `{{ val | fmt("{:?}") }}` as well as enabling convenient filter composition: `{{ price | to_f64 | fmt("${:.2}") | center }}`
Diffstat (limited to '')
-rw-r--r--askama_shared/src/generator.rs18
1 files changed, 18 insertions, 0 deletions
diff --git a/askama_shared/src/generator.rs b/askama_shared/src/generator.rs
index 82f68ff..e45acb6 100644
--- a/askama_shared/src/generator.rs
+++ b/askama_shared/src/generator.rs
@@ -999,6 +999,9 @@ impl<'a, S: std::hash::BuildHasher> Generator<'a, S> {
if name == "format" {
self._visit_format_filter(buf, args);
return DisplayWrap::Unwrapped;
+ } else if name == "fmt" {
+ self._visit_fmt_filter(buf, args);
+ return DisplayWrap::Unwrapped;
} else if name == "join" {
self._visit_join_filter(buf, args);
return DisplayWrap::Unwrapped;
@@ -1038,6 +1041,21 @@ impl<'a, S: std::hash::BuildHasher> Generator<'a, S> {
buf.write(")");
}
+ fn _visit_fmt_filter(&mut self, buf: &mut Buffer, args: &[Expr]) {
+ buf.write("format!(");
+ if let Some(Expr::StrLit(v)) = args.get(1) {
+ self.visit_str_lit(buf, v);
+ buf.write(", ");
+ } else {
+ panic!("invalid expression type for fmt filter");
+ }
+ self._visit_args(buf, &args[0..1]);
+ if args.len() > 2 {
+ panic!("only two arguments allowed to fmt filter");
+ }
+ buf.write(")");
+ }
+
// Force type coercion on first argument to `join` filter (see #39).
fn _visit_join_filter(&mut self, buf: &mut Buffer, args: &[Expr]) {
buf.write("::askama::filters::join((&");