From 8256eadf5a2bba637e9eacf3ffda8cdaffbf8d05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Kijewski?= Date: Tue, 24 Sep 2024 01:48:55 +0200 Subject: [PATCH] derive: unify filter generation further --- rinja_derive/src/generator.rs | 63 +++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 28 deletions(-) diff --git a/rinja_derive/src/generator.rs b/rinja_derive/src/generator.rs index 40ca9d07..f632b4fd 100644 --- a/rinja_derive/src/generator.rs +++ b/rinja_derive/src/generator.rs @@ -20,7 +20,7 @@ use crate::config::WhitespaceHandling; use crate::heritage::{Context, Heritage}; use crate::html::write_escaped_str; use crate::input::{Source, TemplateInput}; -use crate::{CompileError, FileInfo, MsgValidEscapers, CRATE}; +use crate::{CompileError, FileInfo, MsgValidEscapers, BUILT_IN_FILTERS, CRATE}; #[derive(Clone, Copy, PartialEq, Debug)] enum EvaluatedResult { @@ -1534,39 +1534,35 @@ impl<'a> Generator<'a> { buf: &mut Buffer, name: &str, args: &[WithSpan<'_, Expr<'_>>], - filter: &WithSpan<'_, T>, + node: &WithSpan<'_, T>, ) -> Result { - match name { - "abs" | "into_f64" | "into_isize" => { - self._visit_num_traits(ctx, buf, name, args, filter) - } - "deref" => self._visit_deref_filter(ctx, buf, args, filter), - "escape" | "e" => self._visit_escape_filter(ctx, buf, args, filter), - "filesizeformat" => self._visit_humansize(ctx, buf, name, args, filter), - "fmt" => self._visit_fmt_filter(ctx, buf, args, filter), - "format" => self._visit_format_filter(ctx, buf, args, filter), - "join" => self._visit_join_filter(ctx, buf, args), - "json" | "tojson" => self._visit_json_filter(ctx, buf, args, filter), - "linebreaks" | "linebreaksbr" | "paragraphbreaks" => { - self._visit_linebreaks_filter(ctx, buf, name, args, filter) - } - "pluralize" => self._visit_pluralize_filter(ctx, buf, args, filter), - "ref" => self._visit_ref_filter(ctx, buf, args, filter), - "safe" => self._visit_safe_filter(ctx, buf, args, filter), - "uppercase" | "urlencode_strict" => self._visit_urlencode(ctx, buf, name, args, filter), - name if crate::BUILT_IN_FILTERS.contains(&name) => { - self._visit_builtin_filter(ctx, buf, name, args) - } - name => self._visit_custom_filter(ctx, buf, name, args), - } + let filter = match name { + "abs" | "into_f64" | "into_isize" => Self::_visit_num_traits, + "deref" => Self::_visit_deref_filter, + "escape" | "e" => Self::_visit_escape_filter, + "filesizeformat" => Self::_visit_humansize, + "fmt" => Self::_visit_fmt_filter, + "format" => Self::_visit_format_filter, + "join" => Self::_visit_join_filter, + "json" | "tojson" => Self::_visit_json_filter, + "linebreaks" | "linebreaksbr" | "paragraphbreaks" => Self::_visit_linebreaks_filter, + "pluralize" => Self::_visit_pluralize_filter, + "ref" => Self::_visit_ref_filter, + "safe" => Self::_visit_safe_filter, + "uppercase" | "urlencode_strict" => Self::_visit_urlencode, + name if BUILT_IN_FILTERS.contains(&name) => Self::_visit_builtin_filter, + _ => Self::_visit_custom_filter, + }; + filter(self, ctx, buf, name, args, node) } - fn _visit_custom_filter( + fn _visit_custom_filter( &mut self, ctx: &Context<'_>, buf: &mut Buffer, name: &str, args: &[WithSpan<'_, Expr<'_>>], + _node: &WithSpan<'_, T>, ) -> Result { buf.write(format_args!("filters::{name}(")); self._visit_args(ctx, buf, args)?; @@ -1574,12 +1570,13 @@ impl<'a> Generator<'a> { Ok(DisplayWrap::Unwrapped) } - fn _visit_builtin_filter( + fn _visit_builtin_filter( &mut self, ctx: &Context<'_>, buf: &mut Buffer, name: &str, args: &[WithSpan<'_, Expr<'_>>], + _node: &WithSpan<'_, T>, ) -> Result { buf.write(format_args!("{CRATE}::filters::{name}(")); self._visit_args(ctx, buf, args)?; @@ -1663,6 +1660,7 @@ impl<'a> Generator<'a> { &mut self, ctx: &Context<'_>, buf: &mut Buffer, + _name: &str, args: &[WithSpan<'_, Expr<'_>>], node: &WithSpan<'_, T>, ) -> Result { @@ -1735,6 +1733,7 @@ impl<'a> Generator<'a> { &mut self, ctx: &Context<'_>, buf: &mut Buffer, + _name: &str, args: &[WithSpan<'_, Expr<'_>>], node: &WithSpan<'_, T>, ) -> Result { @@ -1751,6 +1750,7 @@ impl<'a> Generator<'a> { &mut self, ctx: &Context<'_>, buf: &mut Buffer, + _name: &str, args: &[WithSpan<'_, Expr<'_>>], node: &WithSpan<'_, T>, ) -> Result { @@ -1767,6 +1767,7 @@ impl<'a> Generator<'a> { &mut self, ctx: &Context<'_>, buf: &mut Buffer, + _name: &str, args: &[WithSpan<'_, Expr<'_>>], node: &WithSpan<'_, T>, ) -> Result { @@ -1793,6 +1794,7 @@ impl<'a> Generator<'a> { &mut self, ctx: &Context<'_>, buf: &mut Buffer, + _name: &str, args: &[WithSpan<'_, Expr<'_>>], node: &WithSpan<'_, T>, ) -> Result { @@ -1809,6 +1811,7 @@ impl<'a> Generator<'a> { &mut self, ctx: &Context<'_>, buf: &mut Buffer, + _name: &str, args: &[WithSpan<'_, Expr<'_>>], node: &WithSpan<'_, T>, ) -> Result { @@ -1869,6 +1872,7 @@ impl<'a> Generator<'a> { &mut self, ctx: &Context<'_>, buf: &mut Buffer, + _name: &str, args: &[WithSpan<'_, Expr<'_>>], node: &WithSpan<'_, T>, ) -> Result { @@ -1891,6 +1895,7 @@ impl<'a> Generator<'a> { &mut self, ctx: &Context<'_>, buf: &mut Buffer, + _name: &str, args: &[WithSpan<'_, Expr<'_>>], node: &WithSpan<'_, T>, ) -> Result { @@ -1908,11 +1913,13 @@ impl<'a> Generator<'a> { } // Force type coercion on first argument to `join` filter (see #39). - fn _visit_join_filter( + fn _visit_join_filter( &mut self, ctx: &Context<'_>, buf: &mut Buffer, + _name: &str, args: &[WithSpan<'_, Expr<'_>>], + _node: &WithSpan<'_, T>, ) -> Result { buf.write(CRATE); buf.write("::filters::join((&");