pub use inner::Color;
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub struct Colors {
pub branches: Option<Color>,
pub vertical: Option<Color>,
pub keywords: Option<Color>,
pub members: Option<Color>,
pub strings: Option<Color>,
pub values: Option<Color>,
pub types: Option<Color>,
}
impl Colors {
pub const NONE: Self = Self::new();
pub const VSCODE_DARK_PLUS: Self = Self::new()
.branches(Some(inner::ansi256(32)))
.vertical(Some(inner::ansi256(24)))
.keywords(Some(inner::ansi256(74)))
.members(Some(inner::ansi256(153)))
.strings(Some(inner::ansi256(173)))
.values(Some(inner::ansi256(187)))
.types(Some(inner::ansi256(79)));
pub const VSCODE_LIGHT_PLUS: Self = Self::new()
.branches(Some(inner::ansi256(28)))
.vertical(Some(inner::ansi256(23)))
.keywords(Some(inner::ansi256(133)))
.members(Some(inner::ansi256(25)))
.strings(Some(inner::ansi256(88)))
.values(Some(inner::ansi256(94)))
.types(Some(inner::ansi256(26)));
pub const SOLARIZED_DARK: Self = Self::new()
.branches(Some(inner::ansi256(101)))
.vertical(Some(inner::ansi256(60)))
.keywords(Some(inner::ansi256(33)))
.members(Some(inner::ansi256(112)))
.strings(Some(inner::ansi256(106)))
.values(Some(inner::ansi256(179)))
.types(Some(inner::ansi256(68)));
pub const SOLARIZED_LIGHT: Self = Self::new()
.branches(Some(inner::ansi256(101)))
.vertical(Some(inner::ansi256(60)))
.keywords(Some(inner::ansi256(33)))
.members(Some(inner::ansi256(112)))
.strings(Some(inner::ansi256(106)))
.values(Some(inner::ansi256(179)))
.types(Some(inner::ansi256(68)));
pub const DRACULA: Self = Self::new()
.branches(Some(inner::ansi256(102)))
.vertical(Some(inner::ansi256(59)))
.keywords(Some(inner::ansi256(141)))
.members(Some(inner::ansi256(147)))
.strings(Some(inner::ansi256(114)))
.values(Some(inner::ansi256(186)))
.types(Some(inner::ansi256(147)));
pub const MONOKAI: Self = Self::new()
.branches(Some(inner::ansi256(144)))
.vertical(Some(inner::ansi256(59)))
.keywords(Some(inner::ansi256(204)))
.members(Some(inner::ansi256(147)))
.strings(Some(inner::ansi256(113)))
.values(Some(inner::ansi256(186)))
.types(Some(inner::ansi256(147)));
pub const NORD: Self = Self::new()
.branches(Some(inner::ansi256(109)))
.vertical(Some(inner::ansi256(66)))
.keywords(Some(inner::ansi256(117)))
.members(Some(inner::ansi256(148)))
.strings(Some(inner::ansi256(150)))
.values(Some(inner::ansi256(179)))
.types(Some(inner::ansi256(148)));
pub const GITHUB_DARK: Self = Self::new()
.branches(Some(inner::ansi256(102)))
.vertical(Some(inner::ansi256(59)))
.keywords(Some(inner::ansi256(204)))
.members(Some(inner::ansi256(117)))
.strings(Some(inner::ansi256(142)))
.values(Some(inner::ansi256(186)))
.types(Some(inner::ansi256(117)));
pub const GITHUB_LIGHT: Self = Self::new()
.branches(Some(inner::ansi256(102)))
.vertical(Some(inner::ansi256(59)))
.keywords(Some(inner::ansi256(204)))
.members(Some(inner::ansi256(26)))
.strings(Some(inner::ansi256(142)))
.values(Some(inner::ansi256(186)))
.types(Some(inner::ansi256(26)));
}
impl Colors {
pub const fn new() -> Self {
Self {
branches: None,
vertical: None,
keywords: None,
members: None,
strings: None,
values: None,
types: None,
}
}
pub const fn branches(mut self, color: Option<Color>) -> Self {
self.branches = color;
self
}
pub const fn vertical(mut self, color: Option<Color>) -> Self {
self.vertical = color;
self
}
pub const fn keywords(mut self, color: Option<Color>) -> Self {
self.keywords = color;
self
}
pub const fn members(mut self, color: Option<Color>) -> Self {
self.members = color;
self
}
pub const fn strings(mut self, color: Option<Color>) -> Self {
self.strings = color;
self
}
pub const fn values(mut self, color: Option<Color>) -> Self {
self.values = color;
self
}
pub const fn types(mut self, color: Option<Color>) -> Self {
self.types = color;
self
}
pub const fn all(mut self, color: Option<Color>) -> Self {
self.branches = color;
self.vertical = color;
self.keywords = color;
self.members = color;
self.strings = color;
self.values = color;
self.types = color;
self
}
}
impl Default for Colors {
fn default() -> Self {
Self::VSCODE_DARK_PLUS
}
}
pub(crate) trait Colored {
fn fg(&self, color: Option<Color>) -> String;
fn stripped(&self) -> String;
}
#[cfg(feature = "color")]
mod inner {
pub use anstyle::Color;
pub(crate) const fn ansi256(color: u8) -> Color {
Color::Ansi256(anstyle::Ansi256Color(color))
}
impl<T: AsRef<str>> super::Colored for T {
fn fg(&self, color: Option<Color>) -> String {
let style = anstyle::Style::new().fg_color(color);
let style_intro = style.render().to_string();
let style_reset = style.render_reset().to_string();
format!("{}{}{}", style_intro, self.as_ref(), style_reset)
}
fn stripped(&self) -> String {
use anstream::adapter::strip_str;
strip_str(self.as_ref()).to_string()
}
}
}
#[cfg(not(feature = "color"))]
mod inner {
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub struct Color;
pub(crate) const fn ansi256(_: u8) -> Color {
Color
}
impl<T: AsRef<str>> super::Colored for T {
fn fg(&self, _: Option<Color>) -> String {
self.as_ref().to_string()
}
fn stripped(&self) -> String {
self.as_ref().to_string()
}
}
}