summaryrefslogtreecommitdiffstats
path: root/src/layout.rs
diff options
context:
space:
mode:
authorUwe Jugel <532284+ubunatic@users.noreply.github.com>2022-10-20 22:56:34 +0200
committerUwe Jugel <532284+ubunatic@users.noreply.github.com>2022-10-20 23:44:13 +0200
commit4bcecaa64228880193ba6b6997b5699718b736ae (patch)
treee7aee34e2cf7da359f0d7343642253a27352c63f /src/layout.rs
parentf8b7ef52fe4a61589eb83d17594e6b939282e691 (diff)
handle unresolved symlinks, do not panic on failed content read
Diffstat (limited to 'src/layout.rs')
-rw-r--r--src/layout.rs36
1 files changed, 25 insertions, 11 deletions
diff --git a/src/layout.rs b/src/layout.rs
index 88c0f8d..495422c 100644
--- a/src/layout.rs
+++ b/src/layout.rs
@@ -35,6 +35,8 @@ pub struct Layout {
}
pub enum PreviewType {
+ NotReadable,
+ UnresolvedSymlink,
TooBigSize,
Directory,
Image,
@@ -51,8 +53,14 @@ impl Layout {
self.clear_preview(self.preview_start_column);
match check_preview_type(item) {
+ PreviewType::NotReadable => {
+ print!("(file not readable)");
+ }
+ PreviewType::UnresolvedSymlink => {
+ print!("(unresolved symlink)");
+ }
PreviewType::TooBigSize => {
- print!("(Too big size to preview)");
+ print!("(file too big for preview)");
}
PreviewType::Directory => {
self.preview_content(item, true);
@@ -223,21 +231,27 @@ pub fn make_layout(
fn check_preview_type(item: &ItemInfo) -> PreviewType {
if item.file_size > MAX_SIZE_TO_PREVIEW {
PreviewType::TooBigSize
- } else if item.file_type == FileType::Directory
- || (item.file_type == FileType::Symlink && item.symlink_dir_path.is_some())
- {
+ } else if item.file_type == FileType::Directory {
PreviewType::Directory
+ } else if item.file_type == FileType::Symlink {
+ if item.symlink_dir_path.is_some() {
+ // assmuning symlink to be a directory
+ PreviewType::Directory
+ } else {
+ PreviewType::UnresolvedSymlink
+ }
} else if is_supported_ext(item) {
PreviewType::Image
} else {
- let content_type = content_inspector::inspect(
- &std::fs::read(&item.file_path)
- .unwrap_or_else(|_| panic!("failed check preview type.")),
- );
- if content_type.is_text() {
- PreviewType::Text
+ if let Ok(content) = &std::fs::read(&item.file_path) {
+ let content_type = content_inspector::inspect(&content);
+ if content_type.is_text() {
+ PreviewType::Text
+ } else {
+ PreviewType::Binary
+ }
} else {
- PreviewType::Binary
+ PreviewType::NotReadable
}
}
}