mirror of
https://github.com/askama-rs/askama.git
synced 2025-09-30 06:21:13 +00:00
derive: unify filter generation further
This commit is contained in:
parent
0c9add9128
commit
8256eadf5a
@ -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((&");
|
||||
|
Loading…
x
Reference in New Issue
Block a user