use atty::Stream; use owo_colors::Style; /** Theme used by [crate::GraphicalReportHandler] to render fancy [crate::Diagnostic] reports. A theme consists of two things: the set of characters to be used for drawing, and the [owo_colors::Style]s to be used to paint various items. You can create your own custom graphical theme using this type, or you can use one of the predefined ones using the methods below. */ #[derive(Debug, Clone)] pub struct GraphicalTheme { /// Characters to be used for drawing. pub characters: ThemeCharacters, /// Styles to be used for painting. pub styles: ThemeStyles, } impl GraphicalTheme { /// ASCII-art-based graphical drawing, with ANSI styling. pub fn ascii() -> Self { Self { characters: ThemeCharacters::ascii(), styles: ThemeStyles::ansi(), } } /// Graphical theme that draws using both ansi colors and unicode characters. pub fn unicode() -> Self { Self { characters: ThemeCharacters::unicode(), styles: ThemeStyles::rgb(), } } /// Graphical theme that draws in monochrome, while still using unicode /// characters. pub fn unicode_nocolor() -> Self { Self { characters: ThemeCharacters::unicode(), styles: ThemeStyles::none(), } } /// A "basic" graphical theme that skips colors and unicode characters and /// just does monochrome ascii art. If you want a completely non-graphical /// rendering of your `Diagnostic`s, check out /// [crate::NarratableReportHandler], or write your own /// [crate::ReportHandler]! pub fn none() -> Self { Self { characters: ThemeCharacters::ascii(), styles: ThemeStyles::none(), } } } impl Default for GraphicalTheme { fn default() -> Self { match std::env::var("NO_COLOR") { _ if !atty::is(Stream::Stdout) || !atty::is(Stream::Stderr) => Self::ascii(), Ok(string) if string != "0" => Self::unicode_nocolor(), _ => Self::unicode(), } } } /** Styles for various parts of graphical rendering for the [crate::GraphicalReportHandler]. */ #[derive(Debug, Clone)] pub struct ThemeStyles { /// Style to apply to things highlighted as "error". pub error: Style, /// Style to apply to things highlighted as "warning". pub warning: Style, /// Style to apply to things highlighted as "advice". pub advice: Style, /// Style to apply to the diagnostic code. pub code: Style, /// Style to apply to the help text. pub help: Style, /// Style to apply to filenames/links/URLs. pub link: Style, /// Styles to cycle through (using `.iter().cycle()`), to render the lines /// and text for diagnostic highlights. pub highlights: Vec