rtml/
render.rs

1pub struct RenderFn<F>(pub F);
2
3impl<F: Fn(&mut std::fmt::Formatter<'_>) -> std::fmt::Result> std::fmt::Display for RenderFn<F> {
4    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5        (self.0)(f)
6    }
7}
8
9#[macro_export]
10macro_rules! render_fn {
11    ($($exp:tt)*) => {
12        RenderFn(move |f: &mut std::fmt::Formatter<'_>| write!(f, $($exp)*))
13    };
14}
15
16#[macro_export]
17macro_rules! iter_fold {
18    ($val:ident, |$tok:ident| $expr:expr) => {
19        $val.iter()
20            .fold(String::new(), |acc, $tok| format!("{}{}", acc, $expr))
21    };
22}
23
24pub trait Render: ToString {
25    fn render(&self) -> String {
26        self.to_string()
27    }
28}
29
30impl Render for &'static str {}
31
32impl Render for std::fmt::Arguments<'_> {
33    fn render(&self) -> String {
34        format!("{}", self)
35    }
36}
37
38impl<F> Render for RenderFn<F>
39where
40    F: Fn(&mut std::fmt::Formatter<'_>) -> std::fmt::Result,
41{
42    fn render(&self) -> String {
43        self.to_string()
44    }
45}