use ansiterm::Style; use crate::theme::lsc::Pair; #[derive(Debug, Default, PartialEq)] pub struct UiStyles { pub colourful: bool, pub filekinds: FileKinds, pub perms: Permissions, pub size: Size, pub users: Users, pub links: Links, pub git: Git, pub security_context: SecurityContext, pub punctuation: Style, pub date: Style, pub inode: Style, pub blocks: Style, pub header: Style, pub octal: Style, pub symlink_path: Style, pub control_char: Style, pub broken_symlink: Style, pub broken_path_overlay: Style, } #[derive(Clone, Copy, Debug, Default, PartialEq)] pub struct FileKinds { pub normal: Style, pub directory: Style, pub symlink: Style, pub pipe: Style, pub block_device: Style, pub char_device: Style, pub socket: Style, pub special: Style, pub executable: Style, pub mount_point: Style, } #[derive(Clone, Copy, Debug, Default, PartialEq)] pub struct Permissions { pub user_read: Style, pub user_write: Style, pub user_execute_file: Style, pub user_execute_other: Style, pub group_read: Style, pub group_write: Style, pub group_execute: Style, pub other_read: Style, pub other_write: Style, pub other_execute: Style, pub special_user_file: Style, pub special_other: Style, pub attribute: Style, } #[derive(Clone, Copy, Debug, Default, PartialEq)] pub struct Size { pub major: Style, pub minor: Style, pub number_byte: Style, pub number_kilo: Style, pub number_mega: Style, pub number_giga: Style, pub number_huge: Style, pub unit_byte: Style, pub unit_kilo: Style, pub unit_mega: Style, pub unit_giga: Style, pub unit_huge: Style, } #[derive(Clone, Copy, Debug, Default, PartialEq)] pub struct Users { pub user_you: Style, pub user_someone_else: Style, pub group_yours: Style, pub group_not_yours: Style, } #[derive(Clone, Copy, Debug, Default, PartialEq)] pub struct Links { pub normal: Style, pub multi_link_file: Style, } #[derive(Clone, Copy, Debug, Default, PartialEq)] pub struct Git { pub new: Style, pub modified: Style, pub deleted: Style, pub renamed: Style, pub typechange: Style, pub ignored: Style, pub conflicted: Style, } #[derive(Clone, Copy, Debug, Default, PartialEq)] pub struct SELinuxContext { pub colon: Style, pub user: Style, pub role: Style, pub typ: Style, pub range: Style, } #[derive(Clone, Copy, Debug, Default, PartialEq)] pub struct SecurityContext { pub none: Style, pub selinux: SELinuxContext, } impl UiStyles { pub fn plain() -> Self { Self::default() } } impl UiStyles { /// Sets a value on this set of colours using one of the keys understood /// by the `LS_COLORS` environment variable. Invalid keys set nothing, but /// return false. pub fn set_ls(&mut self, pair: &Pair<'_>) -> bool { match pair.key { "di" => self.filekinds.directory = pair.to_style(), // DIR "ex" => self.filekinds.executable = pair.to_style(), // EXEC "fi" => self.filekinds.normal = pair.to_style(), // FILE "pi" => self.filekinds.pipe = pair.to_style(), // FIFO "so" => self.filekinds.socket = pair.to_style(), // SOCK "bd" => self.filekinds.block_device = pair.to_style(), // BLK "cd" => self.filekinds.char_device = pair.to_style(), // CHR "ln" => self.filekinds.symlink = pair.to_style(), // LINK "or" => self.broken_symlink = pair.to_style(), // ORPHAN _ => return false, // Codes we don’t do anything with: // MULTIHARDLINK, DOOR, SETUID, SETGID, CAPABILITY, // STICKY_OTHER_WRITABLE, OTHER_WRITABLE, STICKY, MISSING } true } /// Sets a value on this set of colours using one of the keys understood /// by the `EXA_COLORS` environment variable. Invalid keys set nothing, /// but return false. This doesn’t take the `LS_COLORS` keys into account, /// so `set_ls` should have been run first. pub fn set_exa(&mut self, pair: &Pair<'_>) -> bool { match pair.key { "ur" => self.perms.user_read = pair.to_style(), "uw" => self.perms.user_write = pair.to_style(), "ux" => self.perms.user_execute_file = pair.to_style(), "ue" => self.perms.user_execute_other = pair.to_style(), "gr" => self.perms.group_read = pair.to_style(), "gw" => self.perms.group_write = pair.to_style(), "gx" => self.perms.group_execute = pair.to_style(), "tr" => self.perms.other_read = pair.to_style(), "tw" => self.perms.other_write = pair.to_style(), "tx" => self.perms.other_execute = pair.to_style(), "su" => self.perms.special_user_file = pair.to_style(), "sf" => self.perms.special_other = pair.to_style(), "xa" => self.perms.attribute = pair.to_style(), "sn" => self.set_number_style(pair.to_style()), "sb" => self.set_unit_style(pair.to_style()), "nb" => self.size.number_byte = pair.to_style(), "nk" => self.size.number_kilo = pair.to_style(), "nm" => self.size.number_mega = pair.to_style(), "ng" => self.size.number_giga = pair.to_style(), "nh" => self.size.number_huge = pair.to_style(), "ub" => self.size.unit_byte = pair.to_style(), "uk" => self.size.unit_kilo = pair.to_style(), "um" => self.size.unit_mega = pair.to_style(), "ug" => self.size.unit_giga = pair.to_style(), "uh" => self.size.unit_huge = pair.to_style(), "df" => self.size.major = pair.to_style(), "ds" => self.size.minor = pair.to_style(), "uu" => self.users.user_you = pair.to_style(), "un" => self.users.user_someone_else = pair.to_style(), "gu" => self.users.group_yours = pair.to_style(), "gn" => self.users.group_not_yours = pair.to_style(), "lc" => self.links.normal = pair.to_style(), "lm" => self.links.multi_link_file = pair.to_style(), "ga" => self.git.new = pair.to_style(), "gm" => self.git.modified = pair.to_style(), "gd" => self.git.deleted = pair.to_style(), "gv" => self.git.renamed = pair.to_style(), "gt" => self.git.typechange = pair.to_style(), "gi" => self.git.ignored = pair.to_style(), "xx" => self.punctuation = pair.to_style(), "da" => self.date = pair.to_style(), "in" => self.inode = pair.to_style(), "bl" => self.blocks = pair.to_style(), "hd" => self.header = pair.to_style(), "lp" => self.symlink_path = pair.to_style(), "cc" => self.control_char = pair.to_style(), "bO" => self.broken_path_overlay = pair.to_style(), "mp" => self.filekinds.mount_point = pair.to_style(), _ => return false, } true } pub fn set_number_style(&mut self, style: Style) { self.size.number_byte = style; self.size.number_kilo = style; self.size.number_mega = style; self.size.number_giga = style; self.size.number_huge = style; } pub fn set_unit_style(&mut self, style: Style) { self.size.unit_byte = style; self.size.unit_kilo = style; self.size.unit_mega = style; self.size.unit_giga = style; self.size.unit_huge = style; } }