use {
owo_colors::*,
std::{fmt, io, sync::*},
};
pub static DEFAULT_THEME: LazyLock<Theme> = LazyLock::new(|| Theme::default());
pub static PLAIN_THEME: LazyLock<Theme> = LazyLock::new(|| Theme::plain());
#[derive(Clone, Debug)]
pub struct Theme {
pub symbol_style: Style,
pub number_style: Style,
pub string_style: Style,
pub name_style: Style,
pub meta_style: Style,
pub error_style: Style,
pub heading_style: Style,
pub delimiter_style: Style,
}
impl Theme {
pub fn plain() -> Self {
Self {
symbol_style: Default::default(),
number_style: Default::default(),
string_style: Default::default(),
name_style: Default::default(),
meta_style: Default::default(),
error_style: Default::default(),
heading_style: Default::default(),
delimiter_style: Default::default(),
}
}
pub fn symbol<ThingT>(&self, thing: ThingT) -> Styled<ThingT> {
self.symbol_style.style(thing)
}
pub fn number<ThingT>(&self, thing: ThingT) -> Styled<ThingT> {
self.number_style.style(thing)
}
pub fn string<ThingT>(&self, thing: ThingT) -> Styled<ThingT> {
self.string_style.style(thing)
}
pub fn name<ThingT>(&self, thing: ThingT) -> Styled<ThingT> {
self.name_style.style(thing)
}
pub fn meta<ThingT>(&self, thing: ThingT) -> Styled<ThingT> {
self.meta_style.style(thing)
}
pub fn error<ThingT>(&self, thing: ThingT) -> Styled<ThingT> {
self.error_style.style(thing)
}
pub fn heading<ThingT>(&self, thing: ThingT) -> Styled<ThingT> {
self.heading_style.style(thing)
}
pub fn delimiter<ThingT>(&self, thing: ThingT) -> Styled<ThingT> {
self.delimiter_style.style(thing)
}
pub fn write_symbol<WriteT, ThingT>(&self, writer: &mut WriteT, thing: ThingT) -> io::Result<()>
where
WriteT: io::Write,
ThingT: fmt::Display,
{
write!(writer, "{}", self.symbol(thing))
}
pub fn write_number<WriteT, ThingT>(&self, writer: &mut WriteT, thing: ThingT) -> io::Result<()>
where
WriteT: io::Write,
ThingT: fmt::Display,
{
write!(writer, "{}", self.number(thing))
}
pub fn write_string<WriteT, ThingT>(&self, writer: &mut WriteT, thing: ThingT) -> io::Result<()>
where
WriteT: io::Write,
ThingT: fmt::Display,
{
write!(writer, "{}", self.string(thing))
}
pub fn write_name<WriteT, ThingT>(&self, writer: &mut WriteT, thing: ThingT) -> io::Result<()>
where
WriteT: io::Write,
ThingT: fmt::Display,
{
write!(writer, "{}", self.name(thing))
}
pub fn write_meta<WriteT, ThingT>(&self, writer: &mut WriteT, thing: ThingT) -> io::Result<()>
where
WriteT: io::Write,
ThingT: fmt::Display,
{
write!(writer, "{}", self.meta(thing))
}
pub fn write_error<WriteT, ThingT>(&self, writer: &mut WriteT, thing: ThingT) -> io::Result<()>
where
WriteT: io::Write,
ThingT: fmt::Display,
{
write!(writer, "{}", self.error(thing))
}
pub fn write_heading<WriteT, ThingT>(&self, writer: &mut WriteT, thing: ThingT) -> io::Result<()>
where
WriteT: io::Write,
ThingT: fmt::Display,
{
write!(writer, "{}", self.heading(thing))
}
pub fn write_delimiter<WriteT, ThingT>(&self, writer: &mut WriteT, thing: ThingT) -> io::Result<()>
where
WriteT: io::Write,
ThingT: fmt::Display,
{
write!(writer, "{}", self.delimiter(thing))
}
}
impl Default for Theme {
fn default() -> Self {
Self {
symbol_style: Style::default().yellow(),
number_style: Style::default().magenta(),
string_style: Style::default().cyan(),
name_style: Style::default().green(),
meta_style: Style::default().blue().italic(),
error_style: Style::default().red().bold(),
heading_style: Style::default().green().bold().underline(),
delimiter_style: Style::default().dimmed(),
}
}
}