use crate::color::{Color, Rgb, RgbRange};
use log::Level;
pub trait Theme: Send + Sync {
fn solid(&self, level: Level) -> Rgb;
fn range(&self, level: Level) -> RgbRange;
}
#[derive(Clone)]
pub struct Simple {}
impl Theme for Simple {
fn solid(&self, level: Level) -> Rgb {
self.range(level).start
}
fn range(&self, level: Level) -> RgbRange {
match level {
Level::Trace => RgbRange {
start: Color::DarkPink.value(),
end: Color::Pink.value(),
},
Level::Debug => RgbRange {
start: Color::DarkCyan.value(),
end: Color::Cyan.value(),
},
Level::Info => RgbRange {
start: Color::DarkGreen.value(),
end: Color::Green.value(),
},
Level::Warn => RgbRange {
start: Color::DarkOrange.value(),
end: Color::Orange.value(),
},
Level::Error => RgbRange {
start: Color::DarkRed.value(),
end: Color::Red.value(),
},
}
}
}
#[derive(Clone)]
pub struct Spectral {}
impl Theme for Spectral {
fn solid(&self, level: Level) -> Rgb {
self.range(level).end
}
fn range(&self, level: Level) -> RgbRange {
match level {
Level::Trace => RgbRange {
start: Color::DarkMagenta.value(),
end: Color::Pink.value(),
},
Level::Debug => RgbRange {
start: Color::DarkBlue.value(),
end: Color::Cyan.value(),
},
Level::Info => RgbRange {
start: Color::DarkCyan.value(),
end: Color::Green.value(),
},
Level::Warn => RgbRange {
start: Color::DarkYellow.value(),
end: Color::Orange.value(),
},
Level::Error => RgbRange {
start: Color::DarkRed.value(),
end: Color::Red.value(),
},
}
}
}