derive: unify filter generation further

This commit is contained in:
René Kijewski 2024-09-24 01:48:55 +02:00
parent 0c9add9128
commit 8256eadf5a

View File

@ -20,7 +20,7 @@ use crate::config::WhitespaceHandling;
use crate::heritage::{Context, Heritage}; use crate::heritage::{Context, Heritage};
use crate::html::write_escaped_str; use crate::html::write_escaped_str;
use crate::input::{Source, TemplateInput}; 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)] #[derive(Clone, Copy, PartialEq, Debug)]
enum EvaluatedResult { enum EvaluatedResult {
@ -1534,39 +1534,35 @@ impl<'a> Generator<'a> {
buf: &mut Buffer, buf: &mut Buffer,
name: &str, name: &str,
args: &[WithSpan<'_, Expr<'_>>], args: &[WithSpan<'_, Expr<'_>>],
filter: &WithSpan<'_, T>, node: &WithSpan<'_, T>,
) -> Result<DisplayWrap, CompileError> { ) -> Result<DisplayWrap, CompileError> {
match name { let filter = match name {
"abs" | "into_f64" | "into_isize" => { "abs" | "into_f64" | "into_isize" => Self::_visit_num_traits,
self._visit_num_traits(ctx, buf, name, args, filter) "deref" => Self::_visit_deref_filter,
} "escape" | "e" => Self::_visit_escape_filter,
"deref" => self._visit_deref_filter(ctx, buf, args, filter), "filesizeformat" => Self::_visit_humansize,
"escape" | "e" => self._visit_escape_filter(ctx, buf, args, filter), "fmt" => Self::_visit_fmt_filter,
"filesizeformat" => self._visit_humansize(ctx, buf, name, args, filter), "format" => Self::_visit_format_filter,
"fmt" => self._visit_fmt_filter(ctx, buf, args, filter), "join" => Self::_visit_join_filter,
"format" => self._visit_format_filter(ctx, buf, args, filter), "json" | "tojson" => Self::_visit_json_filter,
"join" => self._visit_join_filter(ctx, buf, args), "linebreaks" | "linebreaksbr" | "paragraphbreaks" => Self::_visit_linebreaks_filter,
"json" | "tojson" => self._visit_json_filter(ctx, buf, args, filter), "pluralize" => Self::_visit_pluralize_filter,
"linebreaks" | "linebreaksbr" | "paragraphbreaks" => { "ref" => Self::_visit_ref_filter,
self._visit_linebreaks_filter(ctx, buf, name, args, filter) "safe" => Self::_visit_safe_filter,
} "uppercase" | "urlencode_strict" => Self::_visit_urlencode,
"pluralize" => self._visit_pluralize_filter(ctx, buf, args, filter), name if BUILT_IN_FILTERS.contains(&name) => Self::_visit_builtin_filter,
"ref" => self._visit_ref_filter(ctx, buf, args, filter), _ => Self::_visit_custom_filter,
"safe" => self._visit_safe_filter(ctx, buf, args, filter), };
"uppercase" | "urlencode_strict" => self._visit_urlencode(ctx, buf, name, args, filter), filter(self, ctx, buf, name, args, node)
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),
}
} }
fn _visit_custom_filter( fn _visit_custom_filter<T>(
&mut self, &mut self,
ctx: &Context<'_>, ctx: &Context<'_>,
buf: &mut Buffer, buf: &mut Buffer,
name: &str, name: &str,
args: &[WithSpan<'_, Expr<'_>>], args: &[WithSpan<'_, Expr<'_>>],
_node: &WithSpan<'_, T>,
) -> Result<DisplayWrap, CompileError> { ) -> Result<DisplayWrap, CompileError> {
buf.write(format_args!("filters::{name}(")); buf.write(format_args!("filters::{name}("));
self._visit_args(ctx, buf, args)?; self._visit_args(ctx, buf, args)?;
@ -1574,12 +1570,13 @@ impl<'a> Generator<'a> {
Ok(DisplayWrap::Unwrapped) Ok(DisplayWrap::Unwrapped)
} }
fn _visit_builtin_filter( fn _visit_builtin_filter<T>(
&mut self, &mut self,
ctx: &Context<'_>, ctx: &Context<'_>,
buf: &mut Buffer, buf: &mut Buffer,
name: &str, name: &str,
args: &[WithSpan<'_, Expr<'_>>], args: &[WithSpan<'_, Expr<'_>>],
_node: &WithSpan<'_, T>,
) -> Result<DisplayWrap, CompileError> { ) -> Result<DisplayWrap, CompileError> {
buf.write(format_args!("{CRATE}::filters::{name}(")); buf.write(format_args!("{CRATE}::filters::{name}("));
self._visit_args(ctx, buf, args)?; self._visit_args(ctx, buf, args)?;
@ -1663,6 +1660,7 @@ impl<'a> Generator<'a> {
&mut self, &mut self,
ctx: &Context<'_>, ctx: &Context<'_>,
buf: &mut Buffer, buf: &mut Buffer,
_name: &str,
args: &[WithSpan<'_, Expr<'_>>], args: &[WithSpan<'_, Expr<'_>>],
node: &WithSpan<'_, T>, node: &WithSpan<'_, T>,
) -> Result<DisplayWrap, CompileError> { ) -> Result<DisplayWrap, CompileError> {
@ -1735,6 +1733,7 @@ impl<'a> Generator<'a> {
&mut self, &mut self,
ctx: &Context<'_>, ctx: &Context<'_>,
buf: &mut Buffer, buf: &mut Buffer,
_name: &str,
args: &[WithSpan<'_, Expr<'_>>], args: &[WithSpan<'_, Expr<'_>>],
node: &WithSpan<'_, T>, node: &WithSpan<'_, T>,
) -> Result<DisplayWrap, CompileError> { ) -> Result<DisplayWrap, CompileError> {
@ -1751,6 +1750,7 @@ impl<'a> Generator<'a> {
&mut self, &mut self,
ctx: &Context<'_>, ctx: &Context<'_>,
buf: &mut Buffer, buf: &mut Buffer,
_name: &str,
args: &[WithSpan<'_, Expr<'_>>], args: &[WithSpan<'_, Expr<'_>>],
node: &WithSpan<'_, T>, node: &WithSpan<'_, T>,
) -> Result<DisplayWrap, CompileError> { ) -> Result<DisplayWrap, CompileError> {
@ -1767,6 +1767,7 @@ impl<'a> Generator<'a> {
&mut self, &mut self,
ctx: &Context<'_>, ctx: &Context<'_>,
buf: &mut Buffer, buf: &mut Buffer,
_name: &str,
args: &[WithSpan<'_, Expr<'_>>], args: &[WithSpan<'_, Expr<'_>>],
node: &WithSpan<'_, T>, node: &WithSpan<'_, T>,
) -> Result<DisplayWrap, CompileError> { ) -> Result<DisplayWrap, CompileError> {
@ -1793,6 +1794,7 @@ impl<'a> Generator<'a> {
&mut self, &mut self,
ctx: &Context<'_>, ctx: &Context<'_>,
buf: &mut Buffer, buf: &mut Buffer,
_name: &str,
args: &[WithSpan<'_, Expr<'_>>], args: &[WithSpan<'_, Expr<'_>>],
node: &WithSpan<'_, T>, node: &WithSpan<'_, T>,
) -> Result<DisplayWrap, CompileError> { ) -> Result<DisplayWrap, CompileError> {
@ -1809,6 +1811,7 @@ impl<'a> Generator<'a> {
&mut self, &mut self,
ctx: &Context<'_>, ctx: &Context<'_>,
buf: &mut Buffer, buf: &mut Buffer,
_name: &str,
args: &[WithSpan<'_, Expr<'_>>], args: &[WithSpan<'_, Expr<'_>>],
node: &WithSpan<'_, T>, node: &WithSpan<'_, T>,
) -> Result<DisplayWrap, CompileError> { ) -> Result<DisplayWrap, CompileError> {
@ -1869,6 +1872,7 @@ impl<'a> Generator<'a> {
&mut self, &mut self,
ctx: &Context<'_>, ctx: &Context<'_>,
buf: &mut Buffer, buf: &mut Buffer,
_name: &str,
args: &[WithSpan<'_, Expr<'_>>], args: &[WithSpan<'_, Expr<'_>>],
node: &WithSpan<'_, T>, node: &WithSpan<'_, T>,
) -> Result<DisplayWrap, CompileError> { ) -> Result<DisplayWrap, CompileError> {
@ -1891,6 +1895,7 @@ impl<'a> Generator<'a> {
&mut self, &mut self,
ctx: &Context<'_>, ctx: &Context<'_>,
buf: &mut Buffer, buf: &mut Buffer,
_name: &str,
args: &[WithSpan<'_, Expr<'_>>], args: &[WithSpan<'_, Expr<'_>>],
node: &WithSpan<'_, T>, node: &WithSpan<'_, T>,
) -> Result<DisplayWrap, CompileError> { ) -> Result<DisplayWrap, CompileError> {
@ -1908,11 +1913,13 @@ impl<'a> Generator<'a> {
} }
// Force type coercion on first argument to `join` filter (see #39). // Force type coercion on first argument to `join` filter (see #39).
fn _visit_join_filter( fn _visit_join_filter<T>(
&mut self, &mut self,
ctx: &Context<'_>, ctx: &Context<'_>,
buf: &mut Buffer, buf: &mut Buffer,
_name: &str,
args: &[WithSpan<'_, Expr<'_>>], args: &[WithSpan<'_, Expr<'_>>],
_node: &WithSpan<'_, T>,
) -> Result<DisplayWrap, CompileError> { ) -> Result<DisplayWrap, CompileError> {
buf.write(CRATE); buf.write(CRATE);
buf.write("::filters::join((&"); buf.write("::filters::join((&");