diff options
author | Jiayi Zhao <jeff.no.zhao@gmail.com> | 2020-03-21 12:39:54 -0400 |
---|---|---|
committer | Jiayi Zhao <jeff.no.zhao@gmail.com> | 2020-03-21 12:39:54 -0400 |
commit | c2de16c1e1d7cc8f5cc40f3ca977e01c6e1a9f2a (patch) | |
tree | 7bb04fd08e62f03d34ac500076f4bcd8fbef67a4 /src/fs | |
parent | f2815145cb3da431ebeaf154b8d9964331d6cd4c (diff) |
wrap fs::FileType with in-house solution
- This allows for efficient symlink lookup through caching
- Theme processing happens upfront rather than recomputing styling
over and over
Diffstat (limited to 'src/fs')
-rw-r--r-- | src/fs/dirlist.rs | 10 | ||||
-rw-r--r-- | src/fs/entry.rs | 119 | ||||
-rw-r--r-- | src/fs/metadata.rs | 51 | ||||
-rw-r--r-- | src/fs/mod.rs | 2 |
4 files changed, 88 insertions, 94 deletions
diff --git a/src/fs/dirlist.rs b/src/fs/dirlist.rs index d62664c..d636b2b 100644 --- a/src/fs/dirlist.rs +++ b/src/fs/dirlist.rs @@ -139,8 +139,14 @@ fn map_entry_default(result: std::io::Result<fs::DirEntry>) -> Option<JoshutoDir match result { Ok(direntry) => match JoshutoDirEntry::from(&direntry) { Ok(s) => Some(s), - Err(_) => None, + Err(e) => { + eprintln!("Entry: {:?}, {:?}", direntry, e); + None + } }, - Err(_) => None, + Err(e) => { + eprintln!("{:?}", e); + None + } } } diff --git a/src/fs/entry.rs b/src/fs/entry.rs index 3cba354..80847b4 100644 --- a/src/fs/entry.rs +++ b/src/fs/entry.rs @@ -68,7 +68,7 @@ impl JoshutoDirEntry { pub fn get_fg_color(&self) -> Color { let metadata = &self.metadata; - let filetype = metadata.file_type; + let filetype = &metadata.file_type; if self.is_selected() { THEME_T.selection.fg @@ -92,7 +92,7 @@ impl JoshutoDirEntry { pub fn get_bg_color(&self) -> Color { let metadata = &self.metadata; - let filetype = metadata.file_type; + let filetype = &metadata.file_type; if self.is_selected() { THEME_T.selection.bg @@ -116,119 +116,62 @@ impl JoshutoDirEntry { pub fn get_modifier(&self) -> Modifier { let metadata = &self.metadata; - let filetype = metadata.file_type; - - let mut modifier = Modifier::empty(); + let filetype = &metadata.file_type; if filetype.is_dir() { - if THEME_T.directory.bold { - modifier.insert(Modifier::BOLD); - } - if THEME_T.directory.underline { - modifier.insert(Modifier::UNDERLINED); - } + THEME_T.directory.modifier } else if filetype.is_symlink() { - if THEME_T.link.bold { - modifier.insert(Modifier::BOLD); - } - if THEME_T.link.underline { - modifier.insert(Modifier::UNDERLINED); - } + THEME_T.link.modifier } else { match self.file_path().extension() { - None => {} + None => Modifier::empty(), Some(os_str) => match os_str.to_str() { - None => {} + None => Modifier::empty(), Some(s) => match THEME_T.ext.get(s) { - None => {} - Some(t) => { - if t.bold { - modifier.insert(Modifier::BOLD); - } - if t.underline { - modifier.insert(Modifier::UNDERLINED); - } - } + None => Modifier::empty(), + Some(t) => t.modifier, }, }, - }; + } } - modifier } pub fn get_style(&self) -> Style { let metadata = &self.metadata; - let filetype = metadata.file_type; - - let mut style = Style::default(); + let filetype = &metadata.file_type; if self.is_selected() { - let mut modifier = Modifier::empty(); - if THEME_T.selection.bold { - modifier.insert(Modifier::BOLD); - } - if THEME_T.selection.underline { - modifier.insert(Modifier::UNDERLINED); - } - - style = style.fg(THEME_T.selection.fg).bg(THEME_T.selection.bg); - style = style.modifier(modifier); + Style::default() + .fg(THEME_T.selection.fg) + .bg(THEME_T.selection.bg) + .modifier(THEME_T.selection.modifier) } else if filetype.is_dir() { - let mut modifier = Modifier::empty(); - if THEME_T.directory.bold { - modifier.insert(Modifier::BOLD); - } - if THEME_T.directory.underline { - modifier.insert(Modifier::UNDERLINED); - } - - style = style.fg(THEME_T.directory.fg).bg(THEME_T.directory.bg); - style = style.modifier(modifier); + Style::default() + .fg(THEME_T.directory.fg) + .bg(THEME_T.directory.bg) + .modifier(THEME_T.directory.modifier) } else if filetype.is_symlink() { - let mut modifier = Modifier::empty(); - if THEME_T.link.bold { - modifier.insert(Modifier::BOLD); - } - if THEME_T.link.underline { - modifier.insert(Modifier::UNDERLINED); - } - - style = style.fg(THEME_T.link.fg).bg(THEME_T.link.bg); - style = style.modifier(modifier); + Style::default() + .fg(THEME_T.link.fg) + .bg(THEME_T.link.bg) + .modifier(THEME_T.link.modifier) } else if unix::is_executable(metadata.mode) { - let mut modifier = Modifier::empty(); - if THEME_T.link.bold { - modifier.insert(Modifier::BOLD); - } - if THEME_T.link.underline { - modifier.insert(Modifier::UNDERLINED); - } - - style = style.fg(THEME_T.executable.fg).bg(THEME_T.executable.bg); - style = style.modifier(modifier); + Style::default() + .fg(THEME_T.executable.fg) + .bg(THEME_T.executable.bg) + .modifier(THEME_T.executable.modifier) } else { match self.file_path().extension() { - None => {} + None => Style::default(), Some(os_str) => match os_str.to_str() { - None => {} + None => Style::default(), Some(s) => match THEME_T.ext.get(s) { - None => {} - Some(t) => { - let mut modifier = Modifier::empty(); - if t.bold { - modifier.insert(Modifier::BOLD); - } - if t.underline { - modifier.insert(Modifier::UNDERLINED); - } - style = style.fg(t.fg).bg(t.bg); - style = style.modifier(modifier); - } + None => Style::default(), + Some(t) => Style::default().fg(t.fg).bg(t.bg).modifier(t.modifier), }, }, } } - style } } diff --git a/src/fs/metadata.rs b/src/fs/metadata.rs index 9f3ddd9..9a3fb60 100644 --- a/src/fs/metadata.rs +++ b/src/fs/metadata.rs @@ -1,11 +1,41 @@ use std::{fs, path, process, time}; #[derive(Clone, Debug)] +pub enum FileType { + Directory, + Symlink(String), + File, +} + +impl FileType { + pub fn is_dir(&self) -> bool { + match *self { + Self::Directory => true, + _ => false, + } + } + + pub fn is_symlink(&self) -> bool { + match *self { + Self::Symlink(_) => true, + _ => false, + } + } + + pub fn is_file(&self) -> bool { + match *self { + Self::File => true, + _ => false, + } + } +} + +#[derive(Clone, Debug)] pub struct JoshutoMetadata { pub len: u64, pub modified: time::SystemTime, pub permissions: fs::Permissions, - pub file_type: fs::FileType, + pub file_type: FileType, pub mimetype: Option<String>, #[cfg(unix)] pub uid: u32, @@ -26,9 +56,24 @@ impl JoshutoMetadata { let modified = metadata.modified()?; let permissions = metadata.permissions(); let file_type = metadata.file_type(); - let mut mimetype = None; - if file_type.is_file() { + let file_type = if file_type.is_dir() { + FileType::Directory + } else if file_type.is_symlink() { + let mut link = "".to_string(); + + if let Ok(path) = fs::read_link(path) { + if let Some(s) = path.to_str() { + link = s.to_string(); + } + } + FileType::Symlink(link) + } else { + FileType::File + }; + + let mut mimetype = None; + if let FileType::File = file_type { #[cfg(feature = "file_mimetype")] { mimetype = file_mimetype(path) diff --git a/src/fs/mod.rs b/src/fs/mod.rs index 632c2ff..2704bdc 100644 --- a/src/fs/mod.rs +++ b/src/fs/mod.rs @@ -4,4 +4,4 @@ mod metadata; pub use self::dirlist::JoshutoDirList; pub use self::entry::JoshutoDirEntry; -pub use self::metadata::JoshutoMetadata; +pub use self::metadata::{FileType, JoshutoMetadata}; |