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::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<DisplayWrap, CompileError> {
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<T>(
&mut self,
ctx: &Context<'_>,
buf: &mut Buffer,
name: &str,
args: &[WithSpan<'_, Expr<'_>>],
_node: &WithSpan<'_, T>,
) -> Result<DisplayWrap, CompileError> {
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<T>(
&mut self,
ctx: &Context<'_>,
buf: &mut Buffer,
name: &str,
args: &[WithSpan<'_, Expr<'_>>],
_node: &WithSpan<'_, T>,
) -> Result<DisplayWrap, CompileError> {
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<DisplayWrap, CompileError> {
@ -1735,6 +1733,7 @@ impl<'a> Generator<'a> {
&mut self,
ctx: &Context<'_>,
buf: &mut Buffer,
_name: &str,
args: &[WithSpan<'_, Expr<'_>>],
node: &WithSpan<'_, T>,
) -> Result<DisplayWrap, CompileError> {
@ -1751,6 +1750,7 @@ impl<'a> Generator<'a> {
&mut self,
ctx: &Context<'_>,
buf: &mut Buffer,
_name: &str,
args: &[WithSpan<'_, Expr<'_>>],
node: &WithSpan<'_, T>,
) -> Result<DisplayWrap, CompileError> {
@ -1767,6 +1767,7 @@ impl<'a> Generator<'a> {
&mut self,
ctx: &Context<'_>,
buf: &mut Buffer,
_name: &str,
args: &[WithSpan<'_, Expr<'_>>],
node: &WithSpan<'_, T>,
) -> Result<DisplayWrap, CompileError> {
@ -1793,6 +1794,7 @@ impl<'a> Generator<'a> {
&mut self,
ctx: &Context<'_>,
buf: &mut Buffer,
_name: &str,
args: &[WithSpan<'_, Expr<'_>>],
node: &WithSpan<'_, T>,
) -> Result<DisplayWrap, CompileError> {
@ -1809,6 +1811,7 @@ impl<'a> Generator<'a> {
&mut self,
ctx: &Context<'_>,
buf: &mut Buffer,
_name: &str,
args: &[WithSpan<'_, Expr<'_>>],
node: &WithSpan<'_, T>,
) -> Result<DisplayWrap, CompileError> {
@ -1869,6 +1872,7 @@ impl<'a> Generator<'a> {
&mut self,
ctx: &Context<'_>,
buf: &mut Buffer,
_name: &str,
args: &[WithSpan<'_, Expr<'_>>],
node: &WithSpan<'_, T>,
) -> Result<DisplayWrap, CompileError> {
@ -1891,6 +1895,7 @@ impl<'a> Generator<'a> {
&mut self,
ctx: &Context<'_>,
buf: &mut Buffer,
_name: &str,
args: &[WithSpan<'_, Expr<'_>>],
node: &WithSpan<'_, T>,
) -> Result<DisplayWrap, CompileError> {
@ -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<T>(
&mut self,
ctx: &Context<'_>,
buf: &mut Buffer,
_name: &str,
args: &[WithSpan<'_, Expr<'_>>],
_node: &WithSpan<'_, T>,
) -> Result<DisplayWrap, CompileError> {
buf.write(CRATE);
buf.write("::filters::join((&");