html5ever_arena_dom/
askama.rs1use std::fmt;
2
3use askama::Template;
4use askama::filters::FastWritable;
5
6use crate::{ArenaSinkParser, default_parse_opts, serialize};
7
8pub struct TidyTemplate<T>(pub T);
9
10impl<T: Template> Template for TidyTemplate<T> {
11 fn render_into_with_values<W: core::fmt::Write + ?Sized>(
12 &self,
13 writer: &mut W,
14 values: &dyn askama::Values,
15 ) -> askama::Result<()> {
16 let arena = typed_arena::Arena::new();
17 let mut parser = ArenaSinkParser::new(&arena, default_parse_opts());
18 self.0.render_into_with_values(&mut parser, values)?;
19 serialize(writer, parser.finish())?;
20 Ok(())
21 }
22
23 const SIZE_HINT: usize = T::SIZE_HINT;
24}
25
26impl<T: Template> fmt::Display for TidyTemplate<T> {
27 #[inline]
28 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
29 self.render_into(f).map_err(|_| fmt::Error)
30 }
31}
32
33impl<T: Template> FastWritable for TidyTemplate<T> {
34 #[inline]
35 fn write_into<W: core::fmt::Write + ?Sized>(&self, dest: &mut W) -> askama::Result<()> {
36 self.render_into(dest)
37 }
38}
39
40pub trait TidyTemplateExt: Template {
62 fn as_tidy(&self) -> TidyTemplate<&Self>;
64
65 fn into_tidy(self) -> TidyTemplate<Self>
67 where
68 Self: Sized;
69}
70
71impl<T: Template> TidyTemplateExt for T {
72 #[inline]
73 fn as_tidy(&self) -> TidyTemplate<&Self> {
74 TidyTemplate(self)
75 }
76
77 #[inline]
78 fn into_tidy(self) -> TidyTemplate<Self>
79 where
80 Self: Sized,
81 {
82 TidyTemplate(self)
83 }
84}