use std::io;
use ratatui::{backend::TestBackend, buffer::Buffer};
use crate::{
AnyElement, ComponentDrawer, element::ElementRepr, render::tree::Tree,
terminal::UpdaterTerminal,
};
struct NoopTerminal;
impl UpdaterTerminal for NoopTerminal {
fn insert_before(
&mut self,
_height: u16,
_draw_fn: Box<dyn FnOnce(&mut Buffer)>,
) -> io::Result<()> {
Ok(())
}
}
#[must_use]
pub fn render_frame(el: impl Into<AnyElement<'static>>, width: u16, height: u16) -> Buffer {
render_frames(el, width, height, 1)
}
#[must_use]
pub fn render_frames(
el: impl Into<AnyElement<'static>>,
width: u16,
height: u16,
frames: usize,
) -> Buffer {
let mut el = el.into();
let helper = el.helper();
let mut tree = Tree::new(el.props_mut(), helper);
let mut noop = NoopTerminal;
let mut terminal = ratatui::Terminal::new(TestBackend::new(width, height)).unwrap();
for _ in 0..frames.max(1) {
tree.update_once(&mut noop);
terminal
.draw(|frame| {
let area = frame.area();
let mut drawer = ComponentDrawer::new(frame, area);
tree.draw_root(&mut drawer);
})
.unwrap();
}
terminal.backend().buffer().clone()
}