tui_markup_renderer/
storage.rs

1#![allow(unused_imports)]
2use std::collections::HashMap;
3use std::io::Stdout;
4use std::{
5    borrow::{Borrow, BorrowMut},
6    fmt,
7    ops::Deref,
8};
9use tui::layout::Rect;
10use tui::{
11    backend::{Backend, CrosstermBackend, TestBackend},
12    Frame,
13};
14
15type Callback<B> = fn(&mut Frame<B>);
16
17pub trait IRendererStorage<B: Backend> {
18    fn has_component(&self, tagname: &str) -> bool;
19    fn add_renderer<'b>(&'b mut self, tagname: &'b str, render: Callback<B>) -> &'b mut Self;
20    fn render(&self, tagname: &str, frame: &mut Frame<B>);
21}
22
23#[derive(Default)]
24pub struct RendererStorage<B: Backend> {
25    storage: HashMap<String, Callback<B>>,
26}
27
28impl<B: Backend> RendererStorage<B> {
29    pub fn new() -> Self {
30        RendererStorage {
31            storage: HashMap::new(),
32        }
33    }
34}
35
36impl<B: Backend> IRendererStorage<B> for RendererStorage<B> {
37    fn add_renderer<'b>(&'b mut self, tagname: &'b str, render: Callback<B>) -> &'b mut Self {
38        self.storage.entry(tagname.to_owned()).or_insert(render);
39        self
40    }
41
42    fn has_component(&self, tagname: &str) -> bool {
43        self.storage.contains_key(tagname)
44    }
45
46    fn render(&self, tagname: &str, frame: &mut Frame<B>) {
47        let opt = self.storage.get(tagname);
48        if let Some(f) = opt {
49            f(frame);
50        }
51    }
52}
53
54impl<B: Backend> fmt::Debug for RendererStorage<B> {
55    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
56        let mut r = f.debug_struct("RenderStorage");
57        r.field("Components", &self.storage.keys());
58        r.finish()
59    }
60}
61