use std::fmt::{self, Display}; use yansi_term::{Color::Fixed, Style as AnsiTermStyle}; use crate::formatter::style::{Style, StyleClass, Stylesheet}; struct AnsiTermStyleWrapper { style: AnsiTermStyle, } impl Style for AnsiTermStyleWrapper { fn paint(&self, text: &str, f: &mut fmt::Formatter<'_>) -> fmt::Result { self.style.paint(text).fmt(f) } fn paint_fn<'a>( &self, c: Box) -> fmt::Result + 'a>, f: &mut fmt::Formatter<'_>, ) -> fmt::Result { self.style.paint_fn(c).fmt(f) } fn bold(&self) -> Box { Box::new(AnsiTermStyleWrapper { style: self.style }) } } pub struct AnsiTermStylesheet; impl Stylesheet for AnsiTermStylesheet { fn get_style(&self, class: StyleClass) -> Box { let ansi_term_style = match class { StyleClass::Error => Fixed(9).bold(), StyleClass::Warning => Fixed(11).bold(), StyleClass::Info => Fixed(12).bold(), StyleClass::Note => AnsiTermStyle::new().bold(), StyleClass::Help => Fixed(14).bold(), StyleClass::LineNo => Fixed(12).bold(), StyleClass::Emphasis => AnsiTermStyle::new().bold(), StyleClass::None => AnsiTermStyle::new(), }; Box::new(AnsiTermStyleWrapper { style: ansi_term_style, }) } }