ui_styles.rs 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. use ansiterm::Style;
  2. use crate::theme::lsc::Pair;
  3. #[derive(Debug, Default, PartialEq)]
  4. pub struct UiStyles {
  5. pub colourful: bool,
  6. pub filekinds: FileKinds,
  7. pub perms: Permissions,
  8. pub size: Size,
  9. pub users: Users,
  10. pub links: Links,
  11. pub git: Git,
  12. pub security_context: SecurityContext,
  13. pub punctuation: Style,
  14. pub date: Style,
  15. pub inode: Style,
  16. pub blocks: Style,
  17. pub header: Style,
  18. pub octal: Style,
  19. pub symlink_path: Style,
  20. pub control_char: Style,
  21. pub broken_symlink: Style,
  22. pub broken_path_overlay: Style,
  23. }
  24. #[derive(Clone, Copy, Debug, Default, PartialEq)]
  25. pub struct FileKinds {
  26. pub normal: Style,
  27. pub directory: Style,
  28. pub symlink: Style,
  29. pub pipe: Style,
  30. pub block_device: Style,
  31. pub char_device: Style,
  32. pub socket: Style,
  33. pub special: Style,
  34. pub executable: Style,
  35. pub mount_point: Style,
  36. }
  37. #[derive(Clone, Copy, Debug, Default, PartialEq)]
  38. pub struct Permissions {
  39. pub user_read: Style,
  40. pub user_write: Style,
  41. pub user_execute_file: Style,
  42. pub user_execute_other: Style,
  43. pub group_read: Style,
  44. pub group_write: Style,
  45. pub group_execute: Style,
  46. pub other_read: Style,
  47. pub other_write: Style,
  48. pub other_execute: Style,
  49. pub special_user_file: Style,
  50. pub special_other: Style,
  51. pub attribute: Style,
  52. }
  53. #[derive(Clone, Copy, Debug, Default, PartialEq)]
  54. pub struct Size {
  55. pub major: Style,
  56. pub minor: Style,
  57. pub number_byte: Style,
  58. pub number_kilo: Style,
  59. pub number_mega: Style,
  60. pub number_giga: Style,
  61. pub number_huge: Style,
  62. pub unit_byte: Style,
  63. pub unit_kilo: Style,
  64. pub unit_mega: Style,
  65. pub unit_giga: Style,
  66. pub unit_huge: Style,
  67. }
  68. #[derive(Clone, Copy, Debug, Default, PartialEq)]
  69. pub struct Users {
  70. pub user_you: Style,
  71. pub user_someone_else: Style,
  72. pub group_yours: Style,
  73. pub group_not_yours: Style,
  74. }
  75. #[derive(Clone, Copy, Debug, Default, PartialEq)]
  76. pub struct Links {
  77. pub normal: Style,
  78. pub multi_link_file: Style,
  79. }
  80. #[derive(Clone, Copy, Debug, Default, PartialEq)]
  81. pub struct Git {
  82. pub new: Style,
  83. pub modified: Style,
  84. pub deleted: Style,
  85. pub renamed: Style,
  86. pub typechange: Style,
  87. pub ignored: Style,
  88. pub conflicted: Style,
  89. }
  90. #[derive(Clone, Copy, Debug, Default, PartialEq)]
  91. pub struct SELinuxContext {
  92. pub colon: Style,
  93. pub user: Style,
  94. pub role: Style,
  95. pub typ: Style,
  96. pub range: Style,
  97. }
  98. #[derive(Clone, Copy, Debug, Default, PartialEq)]
  99. pub struct SecurityContext {
  100. pub none: Style,
  101. pub selinux: SELinuxContext,
  102. }
  103. impl UiStyles {
  104. pub fn plain() -> Self {
  105. Self::default()
  106. }
  107. }
  108. impl UiStyles {
  109. /// Sets a value on this set of colours using one of the keys understood
  110. /// by the `LS_COLORS` environment variable. Invalid keys set nothing, but
  111. /// return false.
  112. pub fn set_ls(&mut self, pair: &Pair<'_>) -> bool {
  113. match pair.key {
  114. "di" => self.filekinds.directory = pair.to_style(), // DIR
  115. "ex" => self.filekinds.executable = pair.to_style(), // EXEC
  116. "fi" => self.filekinds.normal = pair.to_style(), // FILE
  117. "pi" => self.filekinds.pipe = pair.to_style(), // FIFO
  118. "so" => self.filekinds.socket = pair.to_style(), // SOCK
  119. "bd" => self.filekinds.block_device = pair.to_style(), // BLK
  120. "cd" => self.filekinds.char_device = pair.to_style(), // CHR
  121. "ln" => self.filekinds.symlink = pair.to_style(), // LINK
  122. "or" => self.broken_symlink = pair.to_style(), // ORPHAN
  123. _ => return false,
  124. // Codes we don’t do anything with:
  125. // MULTIHARDLINK, DOOR, SETUID, SETGID, CAPABILITY,
  126. // STICKY_OTHER_WRITABLE, OTHER_WRITABLE, STICKY, MISSING
  127. }
  128. true
  129. }
  130. /// Sets a value on this set of colours using one of the keys understood
  131. /// by the `EXA_COLORS` environment variable. Invalid keys set nothing,
  132. /// but return false. This doesn’t take the `LS_COLORS` keys into account,
  133. /// so `set_ls` should have been run first.
  134. pub fn set_exa(&mut self, pair: &Pair<'_>) -> bool {
  135. match pair.key {
  136. "ur" => self.perms.user_read = pair.to_style(),
  137. "uw" => self.perms.user_write = pair.to_style(),
  138. "ux" => self.perms.user_execute_file = pair.to_style(),
  139. "ue" => self.perms.user_execute_other = pair.to_style(),
  140. "gr" => self.perms.group_read = pair.to_style(),
  141. "gw" => self.perms.group_write = pair.to_style(),
  142. "gx" => self.perms.group_execute = pair.to_style(),
  143. "tr" => self.perms.other_read = pair.to_style(),
  144. "tw" => self.perms.other_write = pair.to_style(),
  145. "tx" => self.perms.other_execute = pair.to_style(),
  146. "su" => self.perms.special_user_file = pair.to_style(),
  147. "sf" => self.perms.special_other = pair.to_style(),
  148. "xa" => self.perms.attribute = pair.to_style(),
  149. "sn" => self.set_number_style(pair.to_style()),
  150. "sb" => self.set_unit_style(pair.to_style()),
  151. "nb" => self.size.number_byte = pair.to_style(),
  152. "nk" => self.size.number_kilo = pair.to_style(),
  153. "nm" => self.size.number_mega = pair.to_style(),
  154. "ng" => self.size.number_giga = pair.to_style(),
  155. "nh" => self.size.number_huge = pair.to_style(),
  156. "ub" => self.size.unit_byte = pair.to_style(),
  157. "uk" => self.size.unit_kilo = pair.to_style(),
  158. "um" => self.size.unit_mega = pair.to_style(),
  159. "ug" => self.size.unit_giga = pair.to_style(),
  160. "uh" => self.size.unit_huge = pair.to_style(),
  161. "df" => self.size.major = pair.to_style(),
  162. "ds" => self.size.minor = pair.to_style(),
  163. "uu" => self.users.user_you = pair.to_style(),
  164. "un" => self.users.user_someone_else = pair.to_style(),
  165. "gu" => self.users.group_yours = pair.to_style(),
  166. "gn" => self.users.group_not_yours = pair.to_style(),
  167. "lc" => self.links.normal = pair.to_style(),
  168. "lm" => self.links.multi_link_file = pair.to_style(),
  169. "ga" => self.git.new = pair.to_style(),
  170. "gm" => self.git.modified = pair.to_style(),
  171. "gd" => self.git.deleted = pair.to_style(),
  172. "gv" => self.git.renamed = pair.to_style(),
  173. "gt" => self.git.typechange = pair.to_style(),
  174. "gi" => self.git.ignored = pair.to_style(),
  175. "xx" => self.punctuation = pair.to_style(),
  176. "da" => self.date = pair.to_style(),
  177. "in" => self.inode = pair.to_style(),
  178. "bl" => self.blocks = pair.to_style(),
  179. "hd" => self.header = pair.to_style(),
  180. "lp" => self.symlink_path = pair.to_style(),
  181. "cc" => self.control_char = pair.to_style(),
  182. "bO" => self.broken_path_overlay = pair.to_style(),
  183. "mp" => self.filekinds.mount_point = pair.to_style(),
  184. _ => return false,
  185. }
  186. true
  187. }
  188. pub fn set_number_style(&mut self, style: Style) {
  189. self.size.number_byte = style;
  190. self.size.number_kilo = style;
  191. self.size.number_mega = style;
  192. self.size.number_giga = style;
  193. self.size.number_huge = style;
  194. }
  195. pub fn set_unit_style(&mut self, style: Style) {
  196. self.size.unit_byte = style;
  197. self.size.unit_kilo = style;
  198. self.size.unit_mega = style;
  199. self.size.unit_giga = style;
  200. self.size.unit_huge = style;
  201. }
  202. }