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}