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}