use std::fmt;
use ctl_text::{Context, Line, Measurement, Renderable};
use crate::lines::indent_lines;
pub struct Indent<'a> {
columns: u16,
child: Box<dyn Renderable + 'a>,
}
impl<'a> Indent<'a> {
#[must_use]
pub fn new(cells: u16, child: impl Renderable + 'a) -> Self {
Self {
columns: cells,
child: Box::new(child),
}
}
fn inner(&self, context: &Context) -> Context {
context.at_width(context.width().saturating_sub(self.columns).max(1))
}
}
impl fmt::Debug for Indent<'_> {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter
.debug_struct("Indent")
.field("columns", &self.columns)
.finish_non_exhaustive()
}
}
impl Renderable for Indent<'_> {
fn measure(&self, context: &Context) -> Measurement {
let measured = self.child.measure(&self.inner(context));
Measurement::new(
measured.minimum().saturating_add(self.columns),
measured.maximum().saturating_add(self.columns),
)
}
fn render(&self, context: &Context) -> Vec<Line> {
indent_lines(self.child.render(&self.inner(context)), self.columns)
}
}