use core::fmt::{
self,
Display,
Formatter,
};
use {
super::printer::PrettyPrinter,
facet_core::Facet,
};
pub struct PrettyDisplay<'a, T: Facet<'a> + ?Sized> {
pub(crate) value: &'a T,
pub(crate) printer: PrettyPrinter,
}
impl<'a, T: Facet<'a>> Display for PrettyDisplay<'a, T> {
fn fmt(
&self,
f: &mut Formatter<'_>,
) -> fmt::Result {
self.printer.format_to(self.value, f)
}
}
pub trait FacetPretty<'a>: Facet<'a> {
fn pretty(&'a self) -> PrettyDisplay<'a, Self>;
fn pretty_with(
&'a self,
printer: PrettyPrinter,
) -> PrettyDisplay<'a, Self>;
}
impl<'a, T: Facet<'a>> FacetPretty<'a> for T {
fn pretty(&'a self) -> PrettyDisplay<'a, Self> {
PrettyDisplay {
value: self,
printer: PrettyPrinter::default(),
}
}
fn pretty_with(
&'a self,
printer: PrettyPrinter,
) -> PrettyDisplay<'a, Self> {
PrettyDisplay {
value: self,
printer,
}
}
}
#[cfg(test)]
mod tests {
use {
super::*,
core::fmt::Write,
facet::Facet,
};
#[derive(Facet)]
struct TestStruct {
field: u32,
}
#[test]
fn test_pretty_display() {
let test = TestStruct { field: 42 };
let display = test.pretty();
let mut output = String::new();
write!(output, "{display}").unwrap();
assert!(output.contains("field"));
}
#[test]
fn test_pretty_with_custom_printer() {
let test = TestStruct { field: 42 };
let printer = PrettyPrinter::new().with_colors(false);
let display = test.pretty_with(printer);
let mut output = String::new();
write!(output, "{display}").unwrap();
assert!(output.contains("field"));
}
}