use ansi_term::{ANSIString, Colour, Style};
use std::collections::HashMap;
#[allow(dead_code)]
#[derive(Hash, Debug, Eq, PartialEq, Clone)]
pub enum Elem {
File,
SymLink,
BrokenSymLink,
Dir,
Pipe,
BlockDevice,
CharDevice,
Socket,
Special,
Read,
Write,
Exec,
ExecSticky,
NoAccess,
DayOld,
HourOld,
Older,
User,
Group,
FileLarge,
FileMedium,
FileSmall,
}
pub type ColoredString<'a> = ANSIString<'a>;
#[derive(Debug, Copy, Clone)]
pub enum Theme {
NoColor,
Default,
}
pub struct Colors {
colors: Option<HashMap<Elem, Colour>>,
}
impl Colors {
pub fn new(theme: Theme) -> Self {
let colors = match theme {
Theme::NoColor => None,
Theme::Default => Some(Colors::get_light_theme_colour_map()),
};
Colors { colors }
}
pub fn colorize<'a>(&self, input: String, elem: &Elem) -> ColoredString<'a> {
if let Some(ref colors) = self.colors {
colors[elem].paint(input)
} else {
Style::default().paint(input)
}
}
fn get_light_theme_colour_map() -> HashMap<Elem, Colour> {
let mut m = HashMap::new();
m.insert(Elem::User, Colour::Fixed(230)); m.insert(Elem::Group, Colour::Fixed(187));
m.insert(Elem::Read, Colour::Fixed(40)); m.insert(Elem::Write, Colour::Fixed(192)); m.insert(Elem::Exec, Colour::Fixed(124)); m.insert(Elem::ExecSticky, Colour::Fixed(13)); m.insert(Elem::NoAccess, Colour::Fixed(168));
m.insert(Elem::File, Colour::Fixed(184)); m.insert(Elem::Dir, Colour::Fixed(33)); m.insert(Elem::Pipe, Colour::Fixed(44)); m.insert(Elem::SymLink, Colour::Fixed(44)); m.insert(Elem::BrokenSymLink, Colour::Fixed(124)); m.insert(Elem::BlockDevice, Colour::Fixed(44)); m.insert(Elem::CharDevice, Colour::Fixed(44)); m.insert(Elem::Socket, Colour::Fixed(44)); m.insert(Elem::Special, Colour::Fixed(44));
m.insert(Elem::HourOld, Colour::Fixed(40)); m.insert(Elem::DayOld, Colour::Fixed(42)); m.insert(Elem::Older, Colour::Fixed(36));
m.insert(Elem::FileSmall, Colour::Fixed(229)); m.insert(Elem::FileMedium, Colour::Fixed(216)); m.insert(Elem::FileLarge, Colour::Fixed(172));
m
}
}