use crate::Component;
use crate::Dimensions;
use crate::DrawMode;
use crate::Lines;
pub struct DrawVertical {
dim: Dimensions,
lines: Lines,
}
impl DrawVertical {
pub fn new(dimensions: Dimensions) -> DrawVertical {
DrawVertical {
dim: dimensions,
lines: Lines::new(),
}
}
pub fn draw(&mut self, component: &dyn Component, mode: DrawMode) -> anyhow::Result<()> {
let mut output = component.draw(
Dimensions {
width: self.dim.width,
height: self.dim.height.saturating_sub(self.lines.0.len()),
},
mode,
)?;
self.lines.0.append(&mut output.0);
Ok(())
}
pub fn finish(mut self) -> Lines {
self.lines.shrink_lines_to_dimensions(self.dim);
self.lines
}
}
#[cfg(test)]
mod tests {
use crate::components::DrawVertical;
use crate::Component;
use crate::Dimensions;
use crate::DrawMode;
use crate::Line;
use crate::Lines;
#[test]
fn test_draw_vertical() {
#[derive(Debug)]
struct C0;
#[derive(Debug)]
struct C1;
impl Component for C0 {
fn draw_unchecked(
&self,
dimensions: Dimensions,
_mode: DrawMode,
) -> anyhow::Result<Lines> {
assert_eq!(
Dimensions {
width: 10,
height: 20
},
dimensions
);
Ok(Lines(vec![Line::sanitized("foo"), Line::sanitized("bar")]))
}
}
impl Component for C1 {
fn draw_unchecked(
&self,
dimensions: Dimensions,
_mode: DrawMode,
) -> anyhow::Result<Lines> {
assert_eq!(
Dimensions {
width: 10,
height: 18
},
dimensions
);
Ok(Lines(vec![
Line::sanitized("baz"),
Line::sanitized("qux"),
Line::sanitized("quux"),
]))
}
}
let mut draw = DrawVertical::new(Dimensions {
width: 10,
height: 20,
});
draw.draw(&C0, DrawMode::Normal).unwrap();
draw.draw(&C1, DrawMode::Normal).unwrap();
let output = draw.finish();
assert_eq!(
Lines(vec![
Line::sanitized("foo"),
Line::sanitized("bar"),
Line::sanitized("baz"),
Line::sanitized("qux"),
Line::sanitized("quux"),
]),
output
);
}
}