#[macro_export]
macro_rules! drive {
(
frame: $frame:expr,
layout: $layout:expr,
[ $( $component:expr ),* $(,)? ]
) => {{
let chunks = $layout;
let mut chunk_idx = 0;
$(
if let Some(widget) = $component {
if chunk_idx < chunks.len() {
$frame.render_widget(widget, chunks[chunk_idx]);
}
}
chunk_idx += 1;
)*
}};
}
#[macro_export]
macro_rules! drive_to {
(
frame: $frame:expr,
[
$(
( $area:expr, $component:expr, $fallback:expr )
),* $(,)?
]
) => {{
$(
if let Some(widget) = $component {
$frame.render_widget(widget, $area);
} else {
$frame.render_widget($fallback, $area);
}
)*
}};
(
frame: $frame:expr,
[
$(
( $area:expr, $component:expr )
),* $(,)?
]
) => {{
$(
if let Some(widget) = $component {
$frame.render_widget(widget, $area);
}
)*
}};
}
#[cfg(test)]
mod tests {
#[test]
fn test_drive_macro_expands() {
use ratatui::layout::Rect;
use ratatui::text::Text;
use ratatui::widgets::{Block, Borders, Paragraph};
struct MockFrame;
impl MockFrame {
fn render_widget<W>(&mut self, _widget: W, _area: Rect) {}
}
let mut frame = MockFrame;
let text = Text::from("test");
let block = Block::default().borders(Borders::ALL);
let widget1 = Some(Paragraph::new(text.clone()).block(block.clone()));
let widget2 = Some(Paragraph::new(text).block(block));
let chunks = vec![Rect::new(0, 0, 10, 10), Rect::new(0, 10, 10, 10)];
drive! {
frame: frame,
layout: chunks,
[widget1, widget2]
};
}
#[test]
fn test_drive_to_macro_expands() {
use ratatui::layout::Rect;
use ratatui::text::Text;
use ratatui::widgets::{Block, Borders, Paragraph};
struct MockFrame;
impl MockFrame {
fn render_widget<W>(&mut self, _widget: W, _area: Rect) {}
}
let mut frame = MockFrame;
let text = Text::from("test");
let block = Block::default().borders(Borders::ALL);
let widget = Some(Paragraph::new(text.clone()).block(block.clone()));
let fallback = Paragraph::new("fallback");
let area1 = Rect::new(0, 0, 10, 10);
let area2 = Rect::new(0, 10, 10, 10);
drive_to! {
frame: frame,
[
(area1, widget, fallback),
(area2, None::<Paragraph>, Paragraph::new("empty")),
]
};
}
}