rspack_error/displayer/
stdio.rs

1use std::io::Write;
2
3use termcolor::{ColorChoice, StandardStream, WriteColor};
4
5use super::{Display, renderer::Renderer};
6use crate::{Result, diagnostic::Diagnostic};
7
8#[derive(Default)]
9pub struct StdioDisplayer;
10
11impl Display for StdioDisplayer {
12  type Output = Result<()>;
13
14  fn emit_batch_diagnostic<'a>(
15    &self,
16    diagnostics: impl Iterator<Item = &'a Diagnostic>,
17  ) -> Self::Output {
18    let writer = StandardStream::stderr(ColorChoice::Always);
19    let mut lock_writer = writer.lock();
20    let renderer = Renderer::new(lock_writer.supports_color());
21    for diagnostic in diagnostics {
22      let buf = renderer.render(diagnostic)?;
23      lock_writer.write_all(buf.as_bytes())?;
24      // reset to original color after emitting a diagnostic, this avoids interference stdio of other procedure.
25      lock_writer.reset()?;
26    }
27    Ok(())
28  }
29
30  fn emit_diagnostic(&self, diagnostic: &Diagnostic) -> Self::Output {
31    self.emit_batch_diagnostic(vec![diagnostic].into_iter())
32  }
33}