pub use ::pretty::RcDoc;
use std::{fmt, io};
pub trait RenderTarget: io::Write + io::IsTerminal {}
impl<T: io::Write + io::IsTerminal> RenderTarget for T {}
pub trait Print {
fn render(&self, target: &mut dyn io::Write, width: u16) -> io::Result<()>;
fn render_fmt(&self, target: &mut dyn fmt::Write, width: u16) -> fmt::Result;
fn print(&self, target: &mut dyn RenderTarget) -> io::Result<()> {
if target.is_terminal()
&& let Some(size) = termsize::get()
{
self.render(target, size.cols)
} else {
self.render(target, u16::MAX)
}
}
fn println(&self, target: &mut dyn RenderTarget) -> io::Result<()> {
self.print(target)?;
writeln!(target)
}
}
pub trait Pretty {
fn pretty(&self) -> RcDoc<'static>;
}
impl<T: Pretty> Print for T {
fn render(&self, target: &mut dyn io::Write, width: u16) -> io::Result<()> {
self.pretty().render(width as usize, target)
}
fn render_fmt(&self, target: &mut dyn fmt::Write, width: u16) -> fmt::Result {
self.pretty().render_fmt(width as usize, target)
}
}
pub fn quotes(doc: RcDoc) -> RcDoc {
let quote = RcDoc::as_string('"');
quote.clone().append(doc).append(quote)
}
pub fn enclose<'a>(doc: RcDoc<'a>, start: &str, end: &str) -> RcDoc<'a> {
RcDoc::as_string(start)
.append(
RcDoc::softline_()
.append(doc)
.append(RcDoc::softline_())
.nest(1)
.group(),
)
.append(RcDoc::as_string(end))
}
pub fn parens(doc: RcDoc) -> RcDoc {
enclose(doc, "(", ")")
}
pub fn brackets(doc: RcDoc) -> RcDoc {
enclose(doc, "[", "]")
}
pub fn braces(doc: RcDoc) -> RcDoc {
enclose(doc, "{", "}")
}