1use std::fmt::{Result, Write};
2
3pub trait Render: Sized {
5 fn render_into<W: Write>(self, writer: &mut W) -> Result;
8
9 fn render(self) -> String {
11 let mut buf = String::new();
12 self.render_into(&mut buf).unwrap();
13 buf
14 }
15}
16
17impl Render for () {
19 fn render_into<W: Write>(self, _writer: &mut W) -> Result {
20 Ok(())
21 }
22}
23
24impl<A: Render, B: Render> Render for (A, B) {
26 fn render_into<W: Write>(self, writer: &mut W) -> Result {
27 self.0.render_into(writer)?;
28 self.1.render_into(writer)
29 }
30}
31
32impl<A: Render, B: Render, C: Render> Render for (A, B, C) {
34 fn render_into<W: Write>(self, writer: &mut W) -> Result {
35 self.0.render_into(writer)?;
36 self.1.render_into(writer)?;
37 self.2.render_into(writer)
38 }
39}
40
41impl<T: Render> Render for Option<T> {
43 fn render_into<W: Write>(self, writer: &mut W) -> Result {
44 match self {
45 None => Ok(()),
46 Some(x) => x.render_into(writer),
47 }
48 }
49}
50
51impl<T: Render> Render for Vec<T> {
52 fn render_into<W: Write>(self, writer: &mut W) -> Result {
53 for elem in self {
54 elem.render_into(writer)?;
55 }
56 Ok(())
57 }
58}
59
60impl<O: Render, E: Render> Render for std::result::Result<O, E> {
62 fn render_into<W: Write>(self, writer: &mut W) -> Result {
63 match self {
64 Ok(o) => o.render_into(writer),
65 Err(e) => e.render_into(writer),
66 }
67 }
68}