ahecha_html/render/render_string/
mod.rs

1use std::fmt::{Result, Write};
2
3mod attributes;
4mod children;
5mod doctype;
6mod elements;
7mod node;
8mod numbers;
9mod text;
10// mod tuples;
11
12pub trait RenderString: Sized {
13  /// Render the component to a writer.
14  /// Make sure you escape html correctly using the `render::html_escaping` module
15  fn render_into<W: Write>(self, writer: &mut W) -> Result;
16
17  /// Render the component to string
18  fn render(self) -> String {
19    let mut buf = String::new();
20    // dbg!("++++++++", &buf);
21    self.render_into(&mut buf).unwrap();
22    // dbg!("----------", &buf);
23    buf
24  }
25}
26
27// Renders `()` or nothing
28impl RenderString for () {
29  fn render_into<W: Write>(self, _writer: &mut W) -> Result {
30    Ok(())
31  }
32}
33
34/// Renders `T` or nothing
35impl<T: RenderString> RenderString for Option<T> {
36  fn render_into<W: Write>(self, writer: &mut W) -> Result {
37    match self {
38      None => Ok(()),
39      Some(x) => x.render_into(writer),
40    }
41  }
42}
43
44/// Renders a list of `T`
45impl<T: RenderString> RenderString for Vec<T> {
46  fn render_into<W: Write>(self, writer: &mut W) -> Result {
47    for elem in self {
48      elem.render_into(writer)?;
49    }
50    Ok(())
51  }
52}
53
54/// Renders `O` or `E`
55impl<O: RenderString, E: RenderString> RenderString for std::result::Result<O, E> {
56  fn render_into<W: Write>(self, writer: &mut W) -> Result {
57    match self {
58      Ok(o) => o.render_into(writer),
59      Err(e) => e.render_into(writer),
60    }
61  }
62}
63
64/// Renders `bool`
65impl RenderString for bool {
66  fn render_into<W: Write>(self, writer: &mut W) -> Result {
67    if self {
68      write!(writer, "true")?;
69    } else {
70      write!(writer, "false")?;
71    }
72    Ok(())
73  }
74}
75
76// TODO: Play with the idea of removing the tuple_list and instead generate the renderer for each case?
77/*
78macro_rules! impl_render {(
79    $( $n:ident $(, $k:ident)* $(,)? )?
80) => (
81    impl<$($n : Render, $($k : Render),*)?> Render for ( $($n, $($k),*)? ) {
82        fn render (self: Self)
83        {
84            let ( $($n, $($k),*)? ) = self;
85         $( $n.render();
86         $( $k.render(); )*)?
87        }
88    }
89
90    $(
91        impl_render! { $($k),* }
92    )?
93)}
94impl_render!(_6, _5, _4, _3, _2, _1);
95
96trait Render {
97  fn render(self: Self);
98}
99*/