use std::fmt;
use super::DiagnosticList;
pub struct Formatter<'a> {
source: &'a str,
diagnostics: DiagnosticList,
color: bool,
}
impl<'a> Formatter<'a> {
pub fn new(source: &'a str, diagnostics: impl Into<DiagnosticList>) -> Self {
Self {
source,
diagnostics: diagnostics.into(),
color: false,
}
}
#[must_use]
pub fn colored(mut self) -> Self {
self.color = true;
self
}
pub fn enable_colors(&mut self, color: bool) {
self.color = color
}
#[must_use]
pub fn diagnostics(&self) -> &DiagnosticList {
&self.diagnostics
}
}
impl fmt::Display for Formatter<'_> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
use std::str::from_utf8;
use codespan_reporting::{files::SimpleFile, term};
use termcolor::Buffer;
if self.diagnostics.is_empty() {
return Ok(());
}
let file = SimpleFile::new("", self.source);
let config = term::Config::default();
let mut buffer = if self.color {
Buffer::ansi()
} else {
Buffer::no_color()
};
f.write_str("\n")?;
for diagnostic in self.diagnostics.iter() {
term::emit(&mut buffer, &config, &file, &diagnostic.clone().into())
.map_err(|_| fmt::Error)?;
}
let string = from_utf8(buffer.as_slice())
.map_err(|_| fmt::Error)?
.lines()
.map(str::trim_end)
.collect::<Vec<_>>()
.join("\n");
f.write_str(&string)
}
}