use core::fmt::{self, Display, Formatter, Write};
use crate::fmt::IndentWriter;
pub trait Indentable: Sized + Display {
#[must_use = "Indentables do nothing unless used"]
fn indented(self, indent: &str) -> Indented<'_, Self> {
Indented { item: self, indent }
}
#[must_use = "Indentables do nothing unless used"]
fn indented_skip_initial(self, indent: &str) -> IndentedSkipIntial<'_, Self> {
IndentedSkipIntial { item: self, indent }
}
}
impl<T: Display> Indentable for T {}
#[derive(Debug, Clone, Copy)]
pub struct Indented<'i, T: Display> {
pub item: T,
pub indent: &'i str,
}
impl<T: Display> Display for Indented<'_, T> {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write!(IndentWriter::new(self.indent, f), "{}", self.item)
}
}
#[derive(Debug, Clone, Copy)]
pub struct IndentedSkipIntial<'i, T: Display> {
pub item: T,
pub indent: &'i str,
}
impl<T: Display> Display for IndentedSkipIntial<'_, T> {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write!(
IndentWriter::new_skip_initial(self.indent, f),
"{}",
self.item
)
}
}