Skip to main content

temple/
renderer.rs

1use std::fmt;
2use std::io::Write;
3use std::sync::RwLock;
4
5pub struct ComposedRenderer<'a> {
6    renderers: RwLock<Vec<Box<dyn Render + 'a>>>,
7}
8
9pub trait Render {
10    fn render(&self, out: &mut dyn Write);
11}
12
13impl<'a> ComposedRenderer<'a> {
14    pub fn new() -> Self {
15        let renderers = RwLock::new(vec![]);
16        Self { renderers }
17    }
18    pub fn add_renderer(&self, renderer: Box<dyn Render + 'a>) {
19        self.renderers.write().unwrap().push(renderer)
20    }
21}
22
23impl<'a> Render for ComposedRenderer<'a> {
24    fn render(&self, out: &mut dyn Write) {
25        for r in self.renderers.read().unwrap().iter() {
26            r.render(out)
27        }
28    }
29}
30
31impl<'a> fmt::Debug for ComposedRenderer<'a> {
32    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
33        write!(f, "ComposedRenderer")
34    }
35}
36
37#[derive(Debug)]
38pub struct RawTextRenderer<'a> {
39    content: &'a str,
40}
41
42impl<'a> RawTextRenderer<'a> {
43    pub fn new(content: &'a str) -> Self {
44        Self { content }
45    }
46}
47
48impl<'a> Render for RawTextRenderer<'a> {
49    fn render(&self, out: &mut dyn Write) {
50        out.write(self.content.as_bytes());
51    }
52}