From 33a9562379b9d6fdd7be19ce20b3a5ac1fa7e1c7 Mon Sep 17 00:00:00 2001 From: rabite Date: Sat, 16 Mar 2019 14:35:32 +0100 Subject: some error handling modifications --- src/fail.rs | 65 +++++++++++++++++++++++++++++++---------------------- src/file_browser.rs | 17 ++++++++++---- src/files.rs | 7 +++--- src/preview.rs | 8 +++---- 4 files changed, 58 insertions(+), 39 deletions(-) diff --git a/src/fail.rs b/src/fail.rs index a376c09..edbd0b2 100644 --- a/src/fail.rs +++ b/src/fail.rs @@ -16,29 +16,29 @@ pub enum HError { #[fail(display = "IO error: {} ", error)] IoError{#[cause] error: std::io::Error, backtrace: Backtrace}, #[fail(display = "Mutex failed")] - MutexError, + MutexError(Backtrace), #[fail(display = "Can't lock!")] - TryLockError, + TryLockError(Backtrace), #[fail(display = "Channel failed: {}", error)] ChannelTryRecvError{#[cause] error: std::sync::mpsc::TryRecvError}, #[fail(display = "Channel failed: {}", error)] ChannelRecvError{#[cause] error: std::sync::mpsc::RecvError}, #[fail(display = "Channel failed")] - ChannelSendError, + ChannelSendError(Backtrace), #[fail(display = "Previewer failed on file: {}", file)] - PreviewFailed{file: String}, + PreviewFailed{file: String, backtrace: Backtrace}, #[fail(display = "StalePreviewer for file: {}", file)] StalePreviewError{file: String}, #[fail(display = "Failed: {}", error)] - Error{#[cause] error: failure::Error }, + Error{#[cause] error: failure::Error , backtrace: Backtrace}, #[fail(display = "Was None!")] - NoneError, + NoneError(Backtrace), #[fail(display = "Not ready yet!")] WillBeNotReady(Backtrace), #[fail(display = "No widget found")] NoWidgetError(Backtrace), #[fail(display = "Path: {:?} not in this directory: {:?}", path, dir)] - WrongDirectoryError{ path: PathBuf, dir: PathBuf }, + WrongDirectoryError{ path: PathBuf, dir: PathBuf , backtrace: Backtrace}, #[fail(display = "Widget finnished")] PopupFinnished, #[fail(display = "No completions found")] @@ -54,11 +54,11 @@ pub enum HError { #[fail(display = "HBox ratio mismatch: {} widgets, ratio is {:?}", wnum, ratio)] HBoxWrongRatioError{ wnum: usize, ratio: Vec }, #[fail(display = "Got wrong widget: {}! Wanted: {}", got, wanted)] - WrongWidgetError{got: String, wanted: String}, + WrongWidgetError{got: String, wanted: String, backtrace: Backtrace}, #[fail(display = "Strip Prefix Error: {}", error)] - StripPrefixError{#[cause] error: std::path::StripPrefixError}, + StripPrefixError{#[cause] error: std::path::StripPrefixError, backtrace: Backtrace}, #[fail(display = "INofify failed: {}", error)] - INotifyError{#[cause] error: notify::Error}, + INotifyError{#[cause] error: notify::Error, backtrace: Backtrace}, #[fail(display = "Tags not loaded yet")] TagsNotLoadedYetError, #[fail(display = "Input cancelled!")] @@ -81,7 +81,8 @@ impl HError { } pub fn wrong_widget(got: &str, wanted: &str) -> HResult { Err(HError::WrongWidgetError{ got: got.to_string(), - wanted: wanted.to_string()}) + wanted: wanted.to_string(), + backtrace: Backtrace::new()}) } pub fn popup_finnished() -> HResult { Err(HError::PopupFinnished) @@ -98,6 +99,16 @@ impl HError { pub fn undefined_key(key: Key) -> HResult { Err(HError::WidgetUndefinedKeyError { key: key }) } + pub fn wrong_directory(path: PathBuf, dir: PathBuf) -> HResult { + Err(HError::WrongDirectoryError{ path: path, + dir: dir, + backtrace: Backtrace::new() }) + } + pub fn preview_failed(file: &crate::files::File) -> HResult { + let name = file.name.clone(); + Err(HError::PreviewFailed{ file: name, + backtrace: Backtrace::new() }) + } } @@ -122,7 +133,7 @@ pub trait ErrorLog where Self: Sized { impl ErrorLog for HResult { fn log(self) { if let Err(err) = self { - eprintln!("{:?}", err); + // eprintln!("{:?}", err); put_log(&err).ok(); } } @@ -140,7 +151,7 @@ impl ErrorLog for HResult { impl From for HError { fn from(error: std::io::Error) -> Self { - dbg!(&error); + // dbg!(&error); let err = HError::IoError { error: error, backtrace: Backtrace::new() }; put_log(&err).ok(); err @@ -149,8 +160,8 @@ impl From for HError { impl From for HError { fn from(error: failure::Error) -> Self { - dbg!(&error); - let err = HError::Error { error: error }; + // dbg!(&error); + let err = HError::Error { error: error, backtrace: Backtrace::new() }; put_log(&err).ok(); err } @@ -158,7 +169,7 @@ impl From for HError { impl From for HError { fn from(error: std::sync::mpsc::TryRecvError) -> Self { - dbg!(&error); + // dbg!(&error); let err = HError::ChannelTryRecvError { error: error }; put_log(&err).ok(); err @@ -167,7 +178,7 @@ impl From for HError { impl From for HError { fn from(error: std::sync::mpsc::RecvError) -> Self { - dbg!(&error); + // dbg!(&error); let err = HError::ChannelRecvError { error: error }; put_log(&err).ok(); err @@ -177,7 +188,7 @@ impl From for HError { impl From> for HError { fn from(error: std::sync::mpsc::SendError) -> Self { dbg!(&error); - let err = HError::ChannelSendError; + let err = HError::ChannelSendError(Backtrace::new()); put_log(&err).ok(); err } @@ -185,8 +196,8 @@ impl From> for HError { impl From> for HError { fn from(_: std::sync::PoisonError) -> Self { - dbg!("Poisoned Mutex"); - let err = HError::MutexError; + // dbg!("Poisoned Mutex"); + let err = HError::MutexError(Backtrace::new()); put_log(&err).ok(); err } @@ -194,8 +205,8 @@ impl From> for HError { impl From> for HError { fn from(error: std::sync::TryLockError) -> Self { - dbg!(&error); - let err = HError::TryLockError; + // dbg!(&error); + let err = HError::TryLockError(Backtrace::new()); put_log(&err).ok(); err } @@ -204,7 +215,7 @@ impl From> for HError { impl From for HError { fn from(error: std::option::NoneError) -> Self { //dbg!(&error); - let err = HError::NoneError; + let err = HError::NoneError(Backtrace::new()); //put_log(&err).ok(); err } @@ -212,8 +223,8 @@ impl From for HError { impl From for HError { fn from(error: std::path::StripPrefixError) -> Self { - dbg!(&error); - let err = HError::StripPrefixError{error: error}; + // dbg!(&error); + let err = HError::StripPrefixError{error: error, backtrace: Backtrace::new() }; put_log(&err).ok(); err } @@ -221,8 +232,8 @@ impl From for HError { impl From for HError { fn from(error: notify::Error) -> Self { - dbg!(&error); - let err = HError::INotifyError{error: error}; + // dbg!(&error); + let err = HError::INotifyError{error: error, backtrace: Backtrace::new() }; put_log(&err).ok(); err } diff --git a/src/file_browser.rs b/src/file_browser.rs index ca29eda..f39772a 100644 --- a/src/file_browser.rs +++ b/src/file_browser.rs @@ -364,11 +364,13 @@ impl FileBrowser { pub fn set_left_selection(&mut self) -> HResult<()> { if !self.left_widget()?.ready() { return Ok(()) } + if self.cwd.parent().is_none() { return Ok(()) } let parent = self.cwd()?.parent_as_file(); - let left_selection = self.get_selection(&parent?)?; - self.left_widget()?.widget()?.lock()?.as_mut()?.select_file(&left_selection); + if let Ok(left_selection) = self.get_selection(&parent?) { + self.left_widget()?.widget()?.lock()?.as_mut()?.select_file(&left_selection); + } Ok(()) } @@ -448,8 +450,15 @@ impl FileBrowser { } if let Some(preview_dir) = preview_dir { if !watched_dirs.contains(&preview_dir) && preview_dir.is_dir() { - self.watcher.watch(&preview_dir, RecursiveMode::NonRecursive)?; - self.watches.push(preview_dir); + match self.watcher.watch(&preview_dir, RecursiveMode::NonRecursive) { + Ok(_) => self.watches.push(preview_dir), + Err(notify::Error::Io(ioerr)) => { + if ioerr.kind() != std::io::ErrorKind::PermissionDenied { + Err(ioerr)? + } + } + err @ _ => err? + } } } Ok(()) diff --git a/src/files.rs b/src/files.rs index b151e39..e2a5aab 100644 --- a/src/files.rs +++ b/src/files.rs @@ -256,8 +256,7 @@ impl Files { if dir == path { Ok(true) } else { - Err(HError::WrongDirectoryError{path: path.into(), - dir: dir}) + HError::wrong_directory(path.into(), dir)? } } @@ -381,14 +380,14 @@ impl File { pub fn meta(&self) -> HResult { match &self.meta { Some(meta) => Ok(meta.clone()), - None => { Ok(std::fs::metadata(&self.path)?) } + None => { Ok(std::fs::symlink_metadata(&self.path)?) } } } pub fn get_meta(&mut self) -> HResult<()> { if let Some(_) = self.meta { return Ok(()) } - let meta = std::fs::metadata(&self.path)?; + let meta = std::fs::symlink_metadata(&self.path)?; let color = self.get_color(&meta); self.meta = Some(meta); diff --git a/src/preview.rs b/src/preview.rs index f10928c..832f136 100644 --- a/src/preview.rs +++ b/src/preview.rs @@ -320,7 +320,7 @@ impl Previewer { } fn preview_failed(file: &File) -> HResult { - Err(HError::PreviewFailed { file: file.name.clone() }) + HError::preview_failed(file) } fn preview_dir(file: &File, @@ -397,9 +397,9 @@ impl Previewer { } let status = output.status.code() - .ok_or(HError::PreviewFailed{file: file.name.clone()})?; + .ok_or(HError::preview_failed(file)?); - if status == 0 || status == 5 && !is_stale(&stale)? { //is_current(&file) { + if status == Ok(0) || status == Ok(5) && !is_stale(&stale)? { let output = std::str::from_utf8(&output.stdout) .unwrap() .to_string(); @@ -414,7 +414,7 @@ impl Previewer { textview.animate_slide_up().log(); return Ok(Box::new(textview)) } - Err(HError::PreviewFailed{file: file.name.clone()}) + HError::preview_failed(file) } } -- cgit v1.2.3