summaryrefslogtreecommitdiffstats
path: root/src/fs
diff options
context:
space:
mode:
authorJiayi Zhao <jeff.no.zhao@gmail.com>2020-03-21 12:39:54 -0400
committerJiayi Zhao <jeff.no.zhao@gmail.com>2020-03-21 12:39:54 -0400
commitc2de16c1e1d7cc8f5cc40f3ca977e01c6e1a9f2a (patch)
tree7bb04fd08e62f03d34ac500076f4bcd8fbef67a4 /src/fs
parentf2815145cb3da431ebeaf154b8d9964331d6cd4c (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.rs10
-rw-r--r--src/fs/entry.rs119
-rw-r--r--src/fs/metadata.rs51
-rw-r--r--src/fs/mod.rs2
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};