tui_markup_renderer/
storage.rs1#![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