use std::io::Write;
use crate::Diagnostic;
use crate::Error;
use crate::Layout;
use crate::append::Append;
use crate::layout::PlainTextLayout;
use crate::record::Record;
#[derive(Debug)]
pub struct Stdout {
layout: Box<dyn Layout>,
}
impl Default for Stdout {
fn default() -> Self {
Self {
layout: Box::new(PlainTextLayout::default()),
}
}
}
impl Stdout {
pub fn with_layout(mut self, layout: impl Into<Box<dyn Layout>>) -> Self {
self.layout = layout.into();
self
}
}
impl Append for Stdout {
fn append(&self, record: &Record, diags: &[Box<dyn Diagnostic>]) -> Result<(), Error> {
let mut bytes = self.layout.format(record, diags)?;
bytes.push(b'\n');
std::io::stdout()
.write_all(&bytes)
.map_err(Error::from_io_error)?;
Ok(())
}
fn flush(&self) -> Result<(), Error> {
std::io::stdout().flush().map_err(Error::from_io_error)?;
Ok(())
}
}
#[derive(Debug)]
pub struct Stderr {
layout: Box<dyn Layout>,
}
impl Default for Stderr {
fn default() -> Self {
Self {
layout: Box::new(PlainTextLayout::default()),
}
}
}
impl Stderr {
pub fn with_layout(mut self, layout: impl Into<Box<dyn Layout>>) -> Self {
self.layout = layout.into();
self
}
}
impl Append for Stderr {
fn append(&self, record: &Record, diags: &[Box<dyn Diagnostic>]) -> Result<(), Error> {
let mut bytes = self.layout.format(record, diags)?;
bytes.push(b'\n');
std::io::stderr()
.write_all(&bytes)
.map_err(Error::from_io_error)?;
Ok(())
}
fn flush(&self) -> Result<(), Error> {
std::io::stderr().flush().map_err(Error::from_io_error)?;
Ok(())
}
}