1use super::{UnicodeProvider, UnicodeTheme};
5
6#[derive(Debug, Clone, Copy)]
8pub enum FileType {
9 File,
11 Directory,
13 Executable,
15 SymLink,
17 Hidden,
19 Config,
21 Documentation,
23 Image,
25 Video,
27 Audio,
29 Archive,
31 Database,
33 Log,
35 Temporary,
37 Backup,
39}
40
41impl UnicodeProvider for FileType {
42 fn get_char(&self, theme: UnicodeTheme) -> char {
43 match (self, theme) {
44 (FileType::File, UnicodeTheme::Minimal) => '-',
45 (FileType::File, UnicodeTheme::Basic) => '•',
46 (FileType::File, UnicodeTheme::Rich) => '📄',
47 (FileType::File, UnicodeTheme::Fancy) => '📋',
48
49 (FileType::Directory, UnicodeTheme::Minimal) => 'D',
50 (FileType::Directory, UnicodeTheme::Basic) => '/',
51 (FileType::Directory, UnicodeTheme::Rich) => '📁',
52 (FileType::Directory, UnicodeTheme::Fancy) => '🗂',
53
54 (FileType::Executable, UnicodeTheme::Minimal) => 'X',
55 (FileType::Executable, UnicodeTheme::Basic) => '*',
56 (FileType::Executable, UnicodeTheme::Rich) => '⚡',
57 (FileType::Executable, UnicodeTheme::Fancy) => '🔧',
58
59 (FileType::SymLink, UnicodeTheme::Minimal) => 'L',
60 (FileType::SymLink, UnicodeTheme::Basic) => '@',
61 (FileType::SymLink, UnicodeTheme::Rich) => '🔗',
62 (FileType::SymLink, UnicodeTheme::Fancy) => '⛓',
63
64 (FileType::Hidden, UnicodeTheme::Minimal) => '.',
65 (FileType::Hidden, UnicodeTheme::Basic) => '.',
66 (FileType::Hidden, UnicodeTheme::Rich) => '👁',
67 (FileType::Hidden, UnicodeTheme::Fancy) => '🕵',
68
69 (FileType::Config, UnicodeTheme::Minimal) => 'C',
70 (FileType::Config, UnicodeTheme::Basic) => '#',
71 (FileType::Config, UnicodeTheme::Rich) => '⚙',
72 (FileType::Config, UnicodeTheme::Fancy) => '🔧',
73
74 (FileType::Documentation, UnicodeTheme::Minimal) => 'D',
75 (FileType::Documentation, UnicodeTheme::Basic) => '?',
76 (FileType::Documentation, UnicodeTheme::Rich) => '📖',
77 (FileType::Documentation, UnicodeTheme::Fancy) => '📚',
78
79 (FileType::Image, UnicodeTheme::Minimal) => 'I',
80 (FileType::Image, UnicodeTheme::Basic) => '%',
81 (FileType::Image, UnicodeTheme::Rich) => '🖼',
82 (FileType::Image, UnicodeTheme::Fancy) => '🎨',
83
84 (FileType::Video, UnicodeTheme::Minimal) => 'V',
85 (FileType::Video, UnicodeTheme::Basic) => '&',
86 (FileType::Video, UnicodeTheme::Rich) => '🎬',
87 (FileType::Video, UnicodeTheme::Fancy) => '📹',
88
89 (FileType::Audio, UnicodeTheme::Minimal) => 'A',
90 (FileType::Audio, UnicodeTheme::Basic) => '~',
91 (FileType::Audio, UnicodeTheme::Rich) => '🎵',
92 (FileType::Audio, UnicodeTheme::Fancy) => '🎶',
93
94 (FileType::Archive, UnicodeTheme::Minimal) => 'Z',
95 (FileType::Archive, UnicodeTheme::Basic) => '=',
96 (FileType::Archive, UnicodeTheme::Rich) => '📦',
97 (FileType::Archive, UnicodeTheme::Fancy) => '🗜',
98
99 (FileType::Database, UnicodeTheme::Minimal) => 'B',
100 (FileType::Database, UnicodeTheme::Basic) => '#',
101 (FileType::Database, UnicodeTheme::Rich) => '🗄',
102 (FileType::Database, UnicodeTheme::Fancy) => '💾',
103
104 (FileType::Log, UnicodeTheme::Minimal) => 'L',
105 (FileType::Log, UnicodeTheme::Basic) => '|',
106 (FileType::Log, UnicodeTheme::Rich) => '📜',
107 (FileType::Log, UnicodeTheme::Fancy) => '📋',
108
109 (FileType::Temporary, UnicodeTheme::Minimal) => 'T',
110 (FileType::Temporary, UnicodeTheme::Basic) => '~',
111 (FileType::Temporary, UnicodeTheme::Rich) => '⏳',
112 (FileType::Temporary, UnicodeTheme::Fancy) => '🗑',
113
114 (FileType::Backup, UnicodeTheme::Minimal) => 'B',
115 (FileType::Backup, UnicodeTheme::Basic) => '+',
116 (FileType::Backup, UnicodeTheme::Rich) => '💾',
117 (FileType::Backup, UnicodeTheme::Fancy) => '🔄',
118 }
119 }
120}
121
122#[derive(Debug, Clone, Copy)]
124pub enum LanguageType {
125 Rust,
127 JavaScript,
129 Python,
131 C,
133 Java,
135 Go,
137 Html,
139 Css,
141 Json,
143 Xml,
145 Yaml,
147 Toml,
149 Markdown,
151 Shell,
153 Sql,
155 Docker,
157 Git,
159 Code,
161}
162
163impl UnicodeProvider for LanguageType {
164 fn get_char(&self, theme: UnicodeTheme) -> char {
165 match (self, theme) {
166 (LanguageType::Rust, UnicodeTheme::Minimal) => 'R',
167 (LanguageType::Rust, UnicodeTheme::Basic) => 'R',
168 (LanguageType::Rust, UnicodeTheme::Rich) => '🦀',
169 (LanguageType::Rust, UnicodeTheme::Fancy) => '⚙',
170
171 (LanguageType::JavaScript, UnicodeTheme::Minimal) => 'J',
172 (LanguageType::JavaScript, UnicodeTheme::Basic) => 'J',
173 (LanguageType::JavaScript, UnicodeTheme::Rich) => '⚡',
174 (LanguageType::JavaScript, UnicodeTheme::Fancy) => '📜',
175
176 (LanguageType::Python, UnicodeTheme::Minimal) => 'P',
177 (LanguageType::Python, UnicodeTheme::Basic) => 'P',
178 (LanguageType::Python, UnicodeTheme::Rich) => '🐍',
179 (LanguageType::Python, UnicodeTheme::Fancy) => '🐍',
180
181 (LanguageType::C, UnicodeTheme::Minimal) => 'C',
182 (LanguageType::C, UnicodeTheme::Basic) => 'C',
183 (LanguageType::C, UnicodeTheme::Rich) => '⚡',
184 (LanguageType::C, UnicodeTheme::Fancy) => '🔧',
185
186 (LanguageType::Java, UnicodeTheme::Minimal) => 'J',
187 (LanguageType::Java, UnicodeTheme::Basic) => 'J',
188 (LanguageType::Java, UnicodeTheme::Rich) => '☕',
189 (LanguageType::Java, UnicodeTheme::Fancy) => '☕',
190
191 (LanguageType::Go, UnicodeTheme::Minimal) => 'G',
192 (LanguageType::Go, UnicodeTheme::Basic) => 'G',
193 (LanguageType::Go, UnicodeTheme::Rich) => '🐹',
194 (LanguageType::Go, UnicodeTheme::Fancy) => '🚀',
195
196 (LanguageType::Html, UnicodeTheme::Minimal) => 'H',
197 (LanguageType::Html, UnicodeTheme::Basic) => '<',
198 (LanguageType::Html, UnicodeTheme::Rich) => '🌐',
199 (LanguageType::Html, UnicodeTheme::Fancy) => '📄',
200
201 (LanguageType::Css, UnicodeTheme::Minimal) => 'S',
202 (LanguageType::Css, UnicodeTheme::Basic) => '#',
203 (LanguageType::Css, UnicodeTheme::Rich) => '🎨',
204 (LanguageType::Css, UnicodeTheme::Fancy) => '✨',
205
206 (LanguageType::Json, UnicodeTheme::Minimal) => '{',
207 (LanguageType::Json, UnicodeTheme::Basic) => '{',
208 (LanguageType::Json, UnicodeTheme::Rich) => '📋',
209 (LanguageType::Json, UnicodeTheme::Fancy) => '🗂',
210
211 (LanguageType::Xml, UnicodeTheme::Minimal) => '<',
212 (LanguageType::Xml, UnicodeTheme::Basic) => '<',
213 (LanguageType::Xml, UnicodeTheme::Rich) => '📄',
214 (LanguageType::Xml, UnicodeTheme::Fancy) => '🗃',
215
216 (LanguageType::Yaml, UnicodeTheme::Minimal) => 'Y',
217 (LanguageType::Yaml, UnicodeTheme::Basic) => ':',
218 (LanguageType::Yaml, UnicodeTheme::Rich) => '📝',
219 (LanguageType::Yaml, UnicodeTheme::Fancy) => '⚙',
220
221 (LanguageType::Toml, UnicodeTheme::Minimal) => 'T',
222 (LanguageType::Toml, UnicodeTheme::Basic) => '=',
223 (LanguageType::Toml, UnicodeTheme::Rich) => '⚙',
224 (LanguageType::Toml, UnicodeTheme::Fancy) => '🔧',
225
226 (LanguageType::Markdown, UnicodeTheme::Minimal) => 'M',
227 (LanguageType::Markdown, UnicodeTheme::Basic) => '#',
228 (LanguageType::Markdown, UnicodeTheme::Rich) => '📝',
229 (LanguageType::Markdown, UnicodeTheme::Fancy) => '📖',
230
231 (LanguageType::Shell, UnicodeTheme::Minimal) => '$',
232 (LanguageType::Shell, UnicodeTheme::Basic) => '$',
233 (LanguageType::Shell, UnicodeTheme::Rich) => '🐚',
234 (LanguageType::Shell, UnicodeTheme::Fancy) => '⚡',
235
236 (LanguageType::Sql, UnicodeTheme::Minimal) => 'Q',
237 (LanguageType::Sql, UnicodeTheme::Basic) => 'Q',
238 (LanguageType::Sql, UnicodeTheme::Rich) => '🗄',
239 (LanguageType::Sql, UnicodeTheme::Fancy) => '💾',
240
241 (LanguageType::Docker, UnicodeTheme::Minimal) => 'D',
242 (LanguageType::Docker, UnicodeTheme::Basic) => '□',
243 (LanguageType::Docker, UnicodeTheme::Rich) => '🐳',
244 (LanguageType::Docker, UnicodeTheme::Fancy) => '📦',
245
246 (LanguageType::Git, UnicodeTheme::Minimal) => 'G',
247 (LanguageType::Git, UnicodeTheme::Basic) => '*',
248 (LanguageType::Git, UnicodeTheme::Rich) => '🌿',
249 (LanguageType::Git, UnicodeTheme::Fancy) => '🔀',
250
251 (LanguageType::Code, UnicodeTheme::Minimal) => 'C',
252 (LanguageType::Code, UnicodeTheme::Basic) => '<',
253 (LanguageType::Code, UnicodeTheme::Rich) => '💻',
254 (LanguageType::Code, UnicodeTheme::Fancy) => '⌨',
255 }
256 }
257}
258
259pub fn get_file_type_from_extension(extension: &str) -> LanguageType {
261 match extension.to_lowercase().as_str() {
262 "rs" => LanguageType::Rust,
263 "js" | "jsx" | "ts" | "tsx" | "mjs" => LanguageType::JavaScript,
264 "py" | "pyw" | "pyc" | "pyo" | "pyd" => LanguageType::Python,
265 "c" | "h" | "cpp" | "cxx" | "cc" | "hpp" | "hxx" => LanguageType::C,
266 "java" | "class" | "jar" => LanguageType::Java,
267 "go" | "mod" | "sum" => LanguageType::Go,
268 "html" | "htm" | "xhtml" => LanguageType::Html,
269 "css" | "scss" | "sass" | "less" => LanguageType::Css,
270 "json" | "jsonc" => LanguageType::Json,
271 "xml" | "xsd" | "xsl" | "xslt" => LanguageType::Xml,
272 "yml" | "yaml" => LanguageType::Yaml,
273 "toml" => LanguageType::Toml,
274 "md" | "markdown" | "mdown" | "mkd" | "mkdn" => LanguageType::Markdown,
275 "sh" | "bash" | "zsh" | "fish" | "csh" | "tcsh" => LanguageType::Shell,
276 "sql" | "mysql" | "pgsql" | "sqlite" => LanguageType::Sql,
277 "dockerfile" | "containerfile" => LanguageType::Docker,
278 "gitignore" | "gitattributes" | "gitmodules" => LanguageType::Git,
279 _ => LanguageType::Code,
280 }
281}
282
283pub fn get_file_type_from_filename(filename: &str) -> FileType {
285 if filename.starts_with('.') {
286 FileType::Hidden
287 } else if filename.ends_with(".tmp") || filename.ends_with(".temp") {
288 FileType::Temporary
289 } else if filename.ends_with(".bak") || filename.ends_with(".backup") {
290 FileType::Backup
291 } else if filename.ends_with(".log") {
292 FileType::Log
293 } else if matches!(
294 filename.to_lowercase().as_str(),
295 "config" | "configuration" | "settings" | "preferences"
296 ) {
297 FileType::Config
298 } else if matches!(
299 filename.to_lowercase().as_str(),
300 "readme" | "readme.md" | "readme.txt" | "doc" | "docs"
301 ) {
302 FileType::Documentation
303 } else {
304 FileType::File
305 }
306}
307
308pub mod chars {
310 use super::*;
311
312 pub const FILE: FileType = FileType::File;
314 pub const DIRECTORY: FileType = FileType::Directory;
315 pub const EXECUTABLE: FileType = FileType::Executable;
316 pub const SYMLINK: FileType = FileType::SymLink;
317 pub const HIDDEN: FileType = FileType::Hidden;
318 pub const CONFIG: FileType = FileType::Config;
319 pub const DOCUMENTATION: FileType = FileType::Documentation;
320 pub const IMAGE: FileType = FileType::Image;
321 pub const VIDEO: FileType = FileType::Video;
322 pub const AUDIO: FileType = FileType::Audio;
323 pub const ARCHIVE: FileType = FileType::Archive;
324 pub const DATABASE: FileType = FileType::Database;
325 pub const LOG: FileType = FileType::Log;
326 pub const TEMPORARY: FileType = FileType::Temporary;
327 pub const BACKUP: FileType = FileType::Backup;
328
329 pub const RUST: LanguageType = LanguageType::Rust;
331 pub const JAVASCRIPT: LanguageType = LanguageType::JavaScript;
332 pub const PYTHON: LanguageType = LanguageType::Python;
333 pub const C: LanguageType = LanguageType::C;
334 pub const JAVA: LanguageType = LanguageType::Java;
335 pub const GO: LanguageType = LanguageType::Go;
336 pub const HTML: LanguageType = LanguageType::Html;
337 pub const CSS: LanguageType = LanguageType::Css;
338 pub const JSON: LanguageType = LanguageType::Json;
339 pub const XML: LanguageType = LanguageType::Xml;
340 pub const YAML: LanguageType = LanguageType::Yaml;
341 pub const TOML: LanguageType = LanguageType::Toml;
342 pub const MARKDOWN: LanguageType = LanguageType::Markdown;
343 pub const SHELL: LanguageType = LanguageType::Shell;
344 pub const SQL: LanguageType = LanguageType::Sql;
345 pub const DOCKER: LanguageType = LanguageType::Docker;
346 pub const GIT: LanguageType = LanguageType::Git;
347 pub const CODE: LanguageType = LanguageType::Code;
348}