html5ever_arena_dom/
askama.rs

1use 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
40/// Extension trait to wrap a [`Template`] in [`TidyTemplate`].
41///
42/// ```
43/// use askama::Template;
44/// use html5ever_arena_dom::TidyTemplateExt;
45///
46/// #[derive(Debug, Template)]
47/// #[template(
48///     ext = "html",
49///     source = "<title>Test</title><h1>Hello, <b>{{user}}</strong>!</h2"
50/// )]
51/// struct Hello<'a> {
52///     user: &'a str,
53/// }
54///
55/// assert_eq!(
56///     Hello { user: "wörld" }.as_tidy().render().unwrap(),
57///     "<html><head><title>Test</title></head>\
58///      <body><h1>Hello, <b>wörld!</b></h1></body></html>"
59/// );
60/// ```
61pub trait TidyTemplateExt: Template {
62    /// Wrap a reference to the template.
63    fn as_tidy(&self) -> TidyTemplate<&Self>;
64
65    /// Wrap the template.
66    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}