unicode_rs/unicode/
file_types.rs

1//! File type Unicode characters
2//! Icons and indicators for different file types and extensions
3
4use super::{UnicodeProvider, UnicodeTheme};
5
6/// File type indicators
7#[derive(Debug, Clone, Copy)]
8pub enum FileType {
9    /// Regular file
10    File,
11    /// Directory/folder
12    Directory,
13    /// Executable file
14    Executable,
15    /// Symbolic link
16    SymLink,
17    /// Hidden file
18    Hidden,
19    /// Configuration file
20    Config,
21    /// Documentation file
22    Documentation,
23    /// Image file
24    Image,
25    /// Video file
26    Video,
27    /// Audio file
28    Audio,
29    /// Archive file
30    Archive,
31    /// Database file
32    Database,
33    /// Log file
34    Log,
35    /// Temporary file
36    Temporary,
37    /// Backup file
38    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/// Programming language file types
123#[derive(Debug, Clone, Copy)]
124pub enum LanguageType {
125    /// Rust files
126    Rust,
127    /// JavaScript/TypeScript files
128    JavaScript,
129    /// Python files
130    Python,
131    /// C/C++ files
132    C,
133    /// Java files
134    Java,
135    /// Go files
136    Go,
137    /// HTML files
138    Html,
139    /// CSS files
140    Css,
141    /// JSON files
142    Json,
143    /// XML files
144    Xml,
145    /// YAML files
146    Yaml,
147    /// TOML files
148    Toml,
149    /// Markdown files
150    Markdown,
151    /// Shell script files
152    Shell,
153    /// SQL files
154    Sql,
155    /// Docker files
156    Docker,
157    /// Git files
158    Git,
159    /// Unknown/generic code file
160    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
259/// File extension to type mapping
260pub 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
283/// Get file type from filename
284pub 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
308/// Convenience constants for file types
309pub mod chars {
310    use super::*;
311
312    // File types
313    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    // Language types
330    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}