diff --git a/build.rs b/build.rs index a69d83a..a6fddb8 100644 --- a/build.rs +++ b/build.rs @@ -1,26 +1,10 @@ extern crate termion; extern crate rustc_version; -use rustc_version::{version_meta, Channel}; - // use std::process::Command; fn main() -> Result<(),()> { - // Bail out if compiler isn't a nightly - if let Ok(false) = version_meta().map(|m| m.channel == Channel::Nightly) { - eprint!("{}", termion::color::Fg(termion::color::Red)); - eprint!("{}", termion::style::Bold); - eprint!("{}", termion::style::Underline); - eprintln!("NIHGTLY COMPILER required"); - eprintln!("Please install a nighlty compiler to proceed: https://rustup.rs/"); - eprint!("{}", termion::style::Reset); - eprintln!("rustup toolchain install nightly"); - eprintln!("source ~/.cargo/env"); - - return Err(()); - } - // crates.io doesn't allow question marks in file names // So we just stuff that in an archive for distribution diff --git a/src/bookmarks.rs b/src/bookmarks.rs index 208ace0..0168f5a 100644 --- a/src/bookmarks.rs +++ b/src/bookmarks.rs @@ -24,7 +24,7 @@ impl Bookmarks { Ok(()) } pub fn get(&self, key: char) -> HResult<&String> { - let path = self.mapping.get(&key)?; + let path = self.mapping.get(&key).ok_or_else(|| HError::NoneError)?; Ok(path) } pub fn load(&mut self) -> HResult<()> { @@ -105,7 +105,7 @@ impl BMPopup { self.get_core()?.clear()?; let bookmark = self.bookmark_path.take(); - Ok(bookmark?) + Ok(bookmark.ok_or_else(|| HError::NoneError)?) } pub fn add(&mut self, path: &str) -> HResult<()> { @@ -169,7 +169,7 @@ impl Widget for BMPopup { let mut drawlist = String::new(); if !self.add_mode { - let cwd = self.bookmark_path.as_ref()?; + let cwd = self.bookmark_path.as_ref().ok_or_else(|| HError::NoneError)?; drawlist += &self.render_line(ypos, &'`', cwd); } @@ -191,7 +191,7 @@ impl Widget for BMPopup { Key::Char('`') => return HError::popup_finnished(), Key::Char(key) => { if self.add_mode { - let path = self.bookmark_path.take()?; + let path = self.bookmark_path.take().ok_or_else(|| HError::NoneError)?; self.bookmarks.add(key, &path)?; self.add_mode = false; self.bookmarks.save().log(); diff --git a/src/config.rs b/src/config.rs index c4e7049..bdbc5c6 100644 --- a/src/config.rs +++ b/src/config.rs @@ -93,7 +93,7 @@ pub struct Config { pub media_mute: bool, pub media_previewer: String, pub media_previewer_exists: bool, - pub ratios: Vec::, + pub ratios: Vec, pub graphics: String, pub keybinds: KeyBinds, } diff --git a/src/config_installer.rs b/src/config_installer.rs index 4a2ca76..55c98b1 100644 --- a/src/config_installer.rs +++ b/src/config_installer.rs @@ -60,7 +60,7 @@ fn has_config() -> HResult { fn install_config_all() -> HResult<()> { let hunter_dir = crate::paths::hunter_path()?; - let config_dir = hunter_dir.parent()?; + let config_dir = hunter_dir.parent().ok_or_else(|| HError::NoneError)?; if !hunter_dir.exists() { // create if non-existing @@ -156,7 +156,7 @@ pub fn update_config(core: WidgetCore, force: bool) -> HResult<()> { fn update_dir>(source: P, target: P) -> HResult<()> { for file in std::fs::read_dir(source)? { let file_path = file?.path(); - let file_name = file_path.file_name()?; + let file_name = file_path.file_name().ok_or_else(|| HError::NoneError)?; let target_path = target.as_ref().join(file_name); if file_path.is_dir() { diff --git a/src/fail.rs b/src/fail.rs index 503c766..8aa37b8 100644 --- a/src/fail.rs +++ b/src/fail.rs @@ -327,12 +327,12 @@ impl From> for HError { } } -impl From for HError { - fn from(_error: std::option::NoneError) -> Self { - let err = HError::NoneError; - err - } -} +// impl From for HError { +// fn from(_error: std::option::NoneError) -> Self { +// let err = HError::NoneError; +// err +// } +// } impl From for HError { fn from(error: std::path::StripPrefixError) -> Self { diff --git a/src/file_browser.rs b/src/file_browser.rs index 1ff263a..a0a4dd0 100644 --- a/src/file_browser.rs +++ b/src/file_browser.rs @@ -274,7 +274,8 @@ impl FileBrowser { .take(1) .map(|path| { std::path::PathBuf::from(path) - }).last()?; + }).last() + .ok_or_else(|| HError::NoneError)?; let left_path = main_path.parent().map(|p| p.to_path_buf()); let cache = fs_cache.clone(); @@ -433,7 +434,7 @@ impl FileBrowser { .find(|&file| file.is_dir()) .cloned(); - self.main_widget_goto(&next_dir?).log(); + self.main_widget_goto(&next_dir.ok_or_else(|| HError::NoneError)?).log(); Ok(()) } @@ -450,7 +451,7 @@ impl FileBrowser { .find(|&file| file.is_dir()) .cloned(); - self.main_widget_goto(&next_dir?).log(); + self.main_widget_goto(&next_dir.ok_or_else(|| HError::NoneError)?).log(); Ok(()) } @@ -612,7 +613,7 @@ impl FileBrowser { } pub fn goto_prev_cwd(&mut self) -> HResult<()> { - let prev_cwd = self.prev_cwd.take()?; + let prev_cwd = self.prev_cwd.take().ok_or_else(|| HError::NoneError)?; self.main_widget_goto(&prev_cwd)?; Ok(()) } @@ -820,7 +821,7 @@ impl FileBrowser { } pub fn main_async_widget_mut(&mut self) -> HResult<&mut AsyncWidget>> { - let widget = self.columns.active_widget_mut()?; + let widget = self.columns.active_widget_mut().ok_or_else(|| HError::NoneError)?; let widget = match widget { FileBrowserWidgets::FileList(filelist) => filelist, @@ -830,7 +831,7 @@ impl FileBrowser { } pub fn main_widget(&self) -> HResult<&ListView> { - let widget = self.columns.active_widget()?; + let widget = self.columns.active_widget().ok_or_else(|| HError::NoneError)?; let widget = match widget { FileBrowserWidgets::FileList(filelist) => filelist.widget(), @@ -840,7 +841,7 @@ impl FileBrowser { } pub fn main_widget_mut(&mut self) -> HResult<&mut ListView> { - let widget = self.columns.active_widget_mut()?; + let widget = self.columns.active_widget_mut().ok_or_else(|| HError::NoneError)?; let widget = match widget { FileBrowserWidgets::FileList(filelist) => filelist.widget_mut(), @@ -850,7 +851,7 @@ impl FileBrowser { } pub fn left_async_widget_mut(&mut self) -> HResult<&mut AsyncWidget>> { - let widget = match self.columns.widgets.get_mut(0)? { + let widget = match self.columns.widgets.get_mut(0).ok_or_else(|| HError::NoneError)? { FileBrowserWidgets::FileList(filelist) => filelist, _ => { return HError::wrong_widget("previewer", "filelist"); } }; @@ -858,7 +859,7 @@ impl FileBrowser { } pub fn left_widget(&self) -> HResult<&ListView> { - let widget = match self.columns.widgets.get(0)? { + let widget = match self.columns.widgets.get(0).ok_or_else(|| HError::NoneError)? { FileBrowserWidgets::FileList(filelist) => filelist.widget(), _ => { return HError::wrong_widget("previewer", "filelist"); } }; @@ -866,7 +867,7 @@ impl FileBrowser { } pub fn left_widget_mut(&mut self) -> HResult<&mut ListView> { - let widget = match self.columns.widgets.get_mut(0)? { + let widget = match self.columns.widgets.get_mut(0).ok_or_else(|| HError::NoneError)? { FileBrowserWidgets::FileList(filelist) => filelist.widget_mut(), _ => { return HError::wrong_widget("previewer", "filelist"); } }; @@ -874,14 +875,14 @@ impl FileBrowser { } pub fn preview_widget(&self) -> HResult<&Previewer> { - match self.columns.widgets.get(2)? { + match self.columns.widgets.get(2).ok_or_else(|| HError::NoneError)? { FileBrowserWidgets::Previewer(previewer) => Ok(previewer), _ => { return HError::wrong_widget("filelist", "previewer"); } } } pub fn preview_widget_mut(&mut self) -> HResult<&mut Previewer> { - match self.columns.widgets.get_mut(2)? { + match self.columns.widgets.get_mut(2).ok_or_else(|| HError::NoneError)? { FileBrowserWidgets::Previewer(previewer) => Ok(previewer), _ => { return HError::wrong_widget("filelist", "previewer"); } } @@ -938,11 +939,11 @@ impl FileBrowser { format!("\"{}\" ", &f.path.to_string_lossy()) }).collect::(); - let mut filepath = dirs_2::home_dir()?; + let mut filepath = dirs_2::home_dir().ok_or_else(|| HError::NoneError)?; filepath.push(".hunter_cwd"); let output = format!("HUNTER_CWD=\"{}\"\nF=\"{}\"\nMF=({})\n", - cwd.to_str()?, + cwd.to_str().ok_or_else(|| HError::NoneError)?, selected_file, selected_files); @@ -1174,7 +1175,7 @@ impl FileBrowser { continue; } - let dir_path = file_path.parent()?; + let dir_path = file_path.parent().ok_or_else(|| HError::NoneError)?; if self.cwd.path != dir_path { let file_dir = File::new_from_path(&dir_path); @@ -1555,7 +1556,7 @@ impl Widget for FileBrowser { return Ok(()); } (_, Some(2)) => { - self.columns.active_widget_mut()?.on_key(key)?; + self.columns.active_widget_mut().ok_or_else(|| HError::NoneError)?.on_key(key)?; return Ok(()); } _ => {} diff --git a/src/files.rs b/src/files.rs index f78f067..f13157f 100644 --- a/src/files.rs +++ b/src/files.rs @@ -60,7 +60,7 @@ pub fn start_ticking(sender: Sender) { use std::time::Duration; IOTICK_CLIENTS.fetch_add(1, Ordering::Relaxed); - if IOTICK_CLIENTS.load(Ordering::Relaxed) == 1 { + if IOTICK_CLIENTS.load(Ordering::Acquire) == 1 { std::thread::spawn(move || { IOTICK.store(0, Ordering::Relaxed); @@ -76,7 +76,7 @@ pub fn start_ticking(sender: Sender) { .unwrap(); // All jobs done? - if IOTICK_CLIENTS.load(Ordering::Relaxed) == 0 { + if IOTICK_CLIENTS.load(Ordering::Acquire) == 0 { IOTICK.store(0, Ordering::Relaxed); return; } @@ -948,11 +948,16 @@ impl Files { self.recalculate_len(); } + fn remove_placeholder_and_update_files(&mut self, placeholder: &File) -> Option { + let position = self.files.iter().position(|element| *element == *placeholder)?; + Some(self.files.remove(position)) + } + fn remove_placeholder(&mut self) { let dirpath = self.directory.path.clone(); self.find_file_with_path(&dirpath).cloned() .map(|placeholder| { - self.files.remove_item(&placeholder); + self.remove_placeholder_and_update_files(&placeholder); if self.len > 0 { self.len -= 1; } @@ -971,7 +976,7 @@ impl Files { self.stale.as_ref().map(|s| s.set_fresh()); refresh.pull_async()?; let mut refresh = refresh.value?; - self.files = refresh.new_files.take()?; + self.files = refresh.new_files.take().ok_or_else(|| HError::NoneError)?; self.jobs.append(&mut refresh.jobs); if refresh.new_len != self.len() { self.len = refresh.new_len; @@ -1247,7 +1252,7 @@ impl File { } pub fn rename(&mut self, new_path: &Path) -> HResult<()> { - self.name = new_path.file_name()?.to_string_lossy().to_string(); + self.name = new_path.file_name().ok_or_else(|| HError::NoneError)?.to_string_lossy().to_string(); self.path = new_path.into(); Ok(()) } @@ -1427,7 +1432,7 @@ impl File { } pub fn parent_as_file(&self) -> HResult { - let pathbuf = self.parent()?; + let pathbuf = self.parent().ok_or_else(|| HError::NoneError)?; File::new_from_path(&pathbuf) } @@ -1436,7 +1441,7 @@ impl File { } pub fn grand_parent_as_file(&self) -> HResult { - let pathbuf = self.grand_parent()?; + let pathbuf = self.grand_parent().ok_or_else(|| HError::NoneError)?; File::new_from_path(&pathbuf) } @@ -1542,15 +1547,23 @@ impl File { } pub fn is_readable(&self) -> HResult { - let meta = self.meta()?; - let meta = meta.as_ref()?; - let current_user = get_current_username()?.to_string_lossy().to_string(); - let current_group = get_current_groupname()?.to_string_lossy().to_string(); - let file_user = get_user_by_uid(meta.uid())? + let meta = self.meta().ok_or_else(|| HError::NoneError)?; + let meta = meta.as_ref().ok_or_else(|| HError::NoneError)?; + let current_user = get_current_username() + .ok_or_else(|| HError::NoneError)? + .to_string_lossy() + .to_string(); + let current_group = get_current_groupname() + .ok_or_else(|| HError::NoneError)? + .to_string_lossy() + .to_string(); + let file_user = get_user_by_uid(meta.uid()) + .ok_or_else(|| HError::NoneError)? .name() .to_string_lossy() .to_string(); - let file_group = get_group_by_gid(meta.gid())? + let file_group = get_group_by_gid(meta.gid()) + .ok_or_else(|| HError::NoneError)? .name() .to_string_lossy() .to_string(); @@ -1572,8 +1585,8 @@ impl File { } pub fn pretty_print_permissions(&self) -> HResult { - let meta = self.meta()?; - let meta = meta.as_ref()?; + let meta = self.meta().ok_or_else(|| HError::NoneError)?; + let meta = meta.as_ref().ok_or_else(|| HError::NoneError)?; let perms: usize = format!("{:o}", meta.mode()).parse().unwrap(); let perms: usize = perms % 800; @@ -1650,29 +1663,29 @@ impl File { -// Small wrapper that simplifies stopping with more complex control flow -pub struct Ticker { - invalidated: bool -} - -impl Ticker { - pub fn start_ticking(sender: Sender) -> Self { - start_ticking(sender); - Ticker { - invalidated: false - } - } - - pub fn stop_ticking(&mut self) { - stop_ticking(); - self.invalidated = true; - } -} - -impl Drop for Ticker { - fn drop(&mut self) { - if !self.invalidated { - self.stop_ticking(); - } - } -} +// // Small wrapper that simplifies stopping with more complex control flow +// pub struct Ticker { +// invalidated: bool +// } + +// impl Ticker { +// pub fn start_ticking(sender: Sender) -> Self { +// start_ticking(sender); +// Ticker { +// invalidated: false +// } +// } + +// pub fn stop_ticking(&mut self) { +// stop_ticking(); +// self.invalidated = true; +// } +// } + +// impl Drop for Ticker { +// fn drop(&mut self) { +// if !self.invalidated { +// self.stop_ticking(); +// } +// } +// } diff --git a/src/foldview.rs b/src/foldview.rs index b792721..64a749f 100644 --- a/src/foldview.rs +++ b/src/foldview.rs @@ -180,7 +180,7 @@ impl FoldableWidgetExt for ListView> { } fn render_footer(&self) -> HResult { - let current = self.current_fold()?; + let current = self.current_fold().ok_or_else(|| HError::NoneError)?; if let Some(logentry) = self.content.get(current) { let (xsize, ysize) = self.core.coordinates.size_u(); let (_, ypos) = self.core.coordinates.position_u(); @@ -273,7 +273,7 @@ where Bindings<> as ActingExt>::Action>: Default { pub fn toggle_fold(&mut self) -> HResult<()> { - let fold = self.current_fold()?; + let fold = self.current_fold().ok_or_else(|| HError::NoneError)?; let fold_pos = self.fold_start_pos(fold); self.content[fold].toggle_fold(); diff --git a/src/fscache.rs b/src/fscache.rs index 11d30f9..18a33a6 100644 --- a/src/fscache.rs +++ b/src/fscache.rs @@ -203,9 +203,11 @@ impl FsCache { Ok(self.tab_settings .read()? .get(&dir) - .as_ref()? + .as_ref() + .ok_or_else(|| HError::NoneError)? .selection - .as_ref()? + .as_ref() + .ok_or_else(|| HError::NoneError)? .clone()) } @@ -367,7 +369,7 @@ impl FsCache { let dir = &files.directory; let tab_settings = cache.tab_settings.read()?.get(&dir).cloned(); if tab_settings.is_none() { return Ok(()) } - let tab_settings = tab_settings?; + let tab_settings = tab_settings.ok_or_else(|| HError::NoneError)?; if files.show_hidden != tab_settings.dir_settings.show_hidden || files.filter != tab_settings.dir_settings.filter || @@ -480,7 +482,7 @@ impl TryFrom for FsEvent { DebouncedEvent::Rescan => Err(HError::INotifyError("Need to rescan".to_string()))?, // Ignore NoticeRemove/NoticeWrite - _ => None?, + _ => None.ok_or_else(|| HError::NoneError)?, }; Ok(event) diff --git a/src/hbox.rs b/src/hbox.rs index 9e92b55..c0b42a0 100644 --- a/src/hbox.rs +++ b/src/hbox.rs @@ -31,7 +31,7 @@ impl HBox where T: Widget + PartialEq { if self.zoom_active { let coords = self.core.coordinates.clone(); - self.active_widget_mut()?.set_coordinates(&coords).log(); + self.active_widget_mut().ok_or_else(|| HError::NoneError)?.set_coordinates(&coords).log(); return Ok(()); } @@ -178,12 +178,12 @@ impl Widget for HBox where T: Widget + PartialEq { } fn render_header(&self) -> HResult { - self.active_widget()?.render_header() + self.active_widget().ok_or_else(|| HError::NoneError)?.render_header() } fn refresh(&mut self) -> HResult<()> { if self.zoom_active { - self.active_widget_mut()?.refresh().log(); + self.active_widget_mut().ok_or_else(|| HError::NoneError)?.refresh().log(); return Ok(()); } @@ -196,7 +196,7 @@ impl Widget for HBox where T: Widget + PartialEq { fn get_drawlist(&self) -> HResult { if self.zoom_active { - return self.active_widget()?.get_drawlist(); + return self.active_widget().ok_or_else(|| HError::NoneError)?.get_drawlist(); } Ok(self.widgets.iter().map(|child| { @@ -205,11 +205,11 @@ impl Widget for HBox where T: Widget + PartialEq { } fn on_event(&mut self, event: Event) -> HResult<()> { - self.active_widget_mut()?.on_event(event)?; + self.active_widget_mut().ok_or_else(|| HError::NoneError)?.on_event(event)?; Ok(()) } fn on_key(&mut self, key: termion::event::Key) -> HResult<()> { - self.active_widget_mut()?.on_key(key) + self.active_widget_mut().ok_or_else(|| HError::NoneError)?.on_key(key) } } diff --git a/src/imgview.rs b/src/imgview.rs index 6143add..23237a8 100644 --- a/src/imgview.rs +++ b/src/imgview.rs @@ -5,7 +5,7 @@ use std::sync::atomic::{AtomicU32, Ordering}; use crate::widget::{Widget, WidgetCore}; use crate::coordinates::Coordinates; -use crate::fail::{HResult, ErrorCause}; +use crate::fail::{HResult, ErrorCause, HError}; use crate::mediaview::MediaError; @@ -39,7 +39,7 @@ impl ImgView { let (xpix, ypix) = self.core.coordinates.size_pixels()?; let cell_ratio = crate::term::cell_ratio()?; - let file = &self.file.as_ref()?; + let file = &self.file.as_ref().ok_or_else(|| HError::NoneError)?; let media_previewer = self.core.config().media_previewer; let g_mode = self.core.config().graphics; diff --git a/src/keybind.rs b/src/keybind.rs index 64a725a..d29699b 100644 --- a/src/keybind.rs +++ b/src/keybind.rs @@ -396,7 +396,7 @@ where } fn parse_section(ini: &Ini) -> HResult> { - let section = ini.section(Some(Self::section()))?; + let section = ini.section(Some(Self::section())).ok_or_else(|| HError::NoneError)?; let mut bindings = Bindings::new(); diff --git a/src/listview.rs b/src/listview.rs index 2c94ee3..14ae69c 100644 --- a/src/listview.rs +++ b/src/listview.rs @@ -545,13 +545,7 @@ impl ListView self.selected_file_mut().toggle_selection(); if !self.content.filter_selected { - let oldpos = self.get_selection(); self.move_down(); - let newpos = self.get_selection(); - - if newpos > oldpos { - self.update_selected_file(oldpos); - } } else { if self.content.filter_selected && self.content.len() == 0 { self.content.toggle_filter_selected(); @@ -654,7 +648,7 @@ impl ListView if self.searching.is_none() { self.core.show_status("No search pattern set!").log(); } - let prev_search = self.searching.clone()?; + let prev_search = self.searching.clone().ok_or_else(|| HError::NoneError)?; let selection = self.get_selection(); let file = self.content @@ -682,7 +676,7 @@ impl ListView if self.searching.is_none() { self.core.show_status("No search pattern set!").log(); } - let prev_search = self.searching.clone()?; + let prev_search = self.searching.clone().ok_or_else(|| HError::NoneError)?; self.reverse_sort(); diff --git a/src/main.rs b/src/main.rs index 1ce0d87..2de92ee 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,3 @@ -#![feature(vec_remove_item)] -#![feature(trivial_bounds)] -#![feature(try_trait)] #![allow(dead_code)] extern crate termion; diff --git a/src/mediaview.rs b/src/mediaview.rs index 3ab036f..15697ce 100644 --- a/src/mediaview.rs +++ b/src/mediaview.rs @@ -157,8 +157,8 @@ impl MediaView { MediaError::NoPreviewer(msg) })?; - let mut stdout = BufReader::new(previewer.stdout.take()?); - let mut stdin = previewer.stdin.take()?; + let mut stdout = BufReader::new(previewer.stdout.take().ok_or_else(|| HError::NoneError)?); + let mut stdin = previewer.stdin.take().ok_or_else(|| HError::NoneError)?; *cprocess.lock() = Some(previewer); @@ -179,7 +179,8 @@ impl MediaView { loop { // Check if preview-gen finished and break out of loop to restart if let Ok(Some(code)) = cprocess.lock() - .as_mut()? + .as_mut() + .ok_or_else(|| HError::NoneError)? .try_wait() { if code.success() { diff --git a/src/minibuffer.rs b/src/minibuffer.rs index de0ca91..8ee8d4a 100644 --- a/src/minibuffer.rs +++ b/src/minibuffer.rs @@ -86,7 +86,7 @@ impl History { fn get_prev(&mut self, htype: &str) -> HResult { self.load()?; - let history = self.history.get(htype)?; + let history = self.history.get(htype).ok_or_else(|| HError::NoneError)?; let mut position = self.position; let hist_len = history.len(); @@ -107,7 +107,7 @@ impl History { fn get_next(&mut self, htype: &str) -> HResult { self.load()?; - let history = self.history.get(htype)?; + let history = self.history.get(htype).ok_or_else(|| HError::NoneError)?; let mut position = self.position; let hist_len = history.len(); @@ -215,7 +215,7 @@ impl MiniBuffer { let completions = find_files(&part); if let Ok(mut completions) = completions { - let completion = completions.pop()?; + let completion = completions.pop().ok_or_else(|| HError::NoneError)?; let completion = completion.to_string_lossy(); self.input @@ -229,7 +229,7 @@ impl MiniBuffer { let completions = find_bins(&part); if let Ok(mut completions) = completions { - let completion = completions.pop()?; + let completion = completions.pop().ok_or_else(|| HError::NoneError)?; let completion = completion.to_string_lossy(); self.input = self.input[..self.input.len() @@ -249,13 +249,13 @@ impl MiniBuffer { } pub fn cycle_completions(&mut self) -> HResult<()> { - let last_comp = self.last_completion.as_ref()?; + let last_comp = self.last_completion.as_ref().ok_or_else(|| HError::NoneError)?; let last_len = last_comp.len(); self.input = self.input.trim_end_matches(last_comp).to_string(); self.position = self.position.saturating_sub(last_len); - let next_comp = self.completions.pop()?; + let next_comp = self.completions.pop().ok_or_else(|| HError::NoneError)?; let next_comp = next_comp.to_string_lossy(); self.input.push_str(&next_comp); self.position += next_comp.len(); @@ -375,7 +375,7 @@ impl MiniBuffer { pub fn find_bins(comp_name: &str) -> HResult> { use osstrtools::OsStrTools; - let paths = std::env::var_os("PATH")?; + let paths = std::env::var_os("PATH").ok_or_else(|| HError::NoneError)?; let paths = paths.split(":"); let completions = paths.iter().map(|path| { @@ -417,9 +417,9 @@ pub fn find_files(comp_name: &str) -> HResult> { } let comp_name = OsStr::new(comp_name); - let filename_part = path.file_name()?; + let filename_part = path.file_name().ok_or_else(|| HError::NoneError)?; - let dir = if path.is_dir() { &path } else { path.parent()? }; + let dir = if path.is_dir() { &path } else { path.parent().ok_or_else(|| HError::NoneError)? }; let dir = std::path::PathBuf::from(dir); let prefix = comp_name.trim_end(&filename_part); diff --git a/src/paths.rs b/src/paths.rs index 24336e8..14e5133 100644 --- a/src/paths.rs +++ b/src/paths.rs @@ -2,22 +2,22 @@ use dirs_2; use std::path::PathBuf; -use crate::fail::HResult; +use crate::fail::{HError, HResult}; pub fn home_path() -> HResult { - let home = dirs_2::home_dir()?; + let home = dirs_2::home_dir().ok_or_else(|| HError::NoneError)?; Ok(home) } pub fn ranger_path() -> HResult { - let mut ranger_path = dirs_2::config_dir()?; + let mut ranger_path = dirs_2::config_dir().ok_or_else(|| HError::NoneError)?; ranger_path.push("ranger/"); Ok(ranger_path) } #[cfg(not(target_os = "macos"))] pub fn hunter_path() -> HResult { - let mut hunter_path = dirs_2::config_dir()?; + let mut hunter_path = dirs_2::config_dir().ok_or_else(|| HError::NoneError)?; hunter_path.push("hunter/"); Ok(hunter_path) } diff --git a/src/preview.rs b/src/preview.rs index 394cf7f..6efa263 100644 --- a/src/preview.rs +++ b/src/preview.rs @@ -6,7 +6,7 @@ use parking_lot::Mutex; use std::sync::Arc; use std::path::PathBuf; -use crate::files::{File, Files, Kind, Ticker}; +use crate::files::{File, Files, Kind}; use crate::fscache::FsCache; use crate::listview::{ListView, FileSource}; use crate::textview::TextView; @@ -76,6 +76,7 @@ impl AsyncWidget { let mut widget = Async::new(move |stale| closure(stale).map_err(|e| e.into())); widget.on_ready(move |_, stale| { + crate::files::stop_ticking(); if !stale.is_stale()? { sender.lock() .send(crate::widget::Events::WidgetReady) @@ -85,6 +86,7 @@ impl AsyncWidget { Ok(()) }).log(); + crate::files::start_ticking(core.get_sender()); widget.run().log(); AsyncWidget { @@ -101,12 +103,14 @@ impl AsyncWidget { let sender = Mutex::new(self.get_core()?.get_sender()); let core = self.get_core()?.clone(); + let closure_core = core.clone(); let mut widget = Async::new(move |stale| { - Ok(closure(stale, core.clone())?) + Ok(closure(stale, closure_core)?) }); widget.on_ready(move |_, stale| { + crate::files::stop_ticking(); if !stale.is_stale()? { sender.lock() .send(crate::widget::Events::WidgetReady) @@ -116,6 +120,7 @@ impl AsyncWidget { Ok(()) }).log(); + crate::files::start_ticking(core.get_sender()); widget.run().log(); self.widget = widget; @@ -234,7 +239,7 @@ enum ExtPreviewer { fn find_previewer(file: &File, g_mode: bool) -> HResult { let path = crate::paths::previewers_path()?; - let ext = file.path.extension()?; + let ext = file.path.extension().ok_or_else(|| HError::NoneError)?; // Try to find a graphical previewer first if g_mode { @@ -273,7 +278,7 @@ fn find_previewer(file: &File, g_mode: bool) -> HResult { } } - Ok(ExtPreviewer::Text(previewer??)) + Ok(ExtPreviewer::Text(previewer.ok_or_else(|| HError::NoneError)??)) } @@ -417,7 +422,6 @@ impl Previewer { } "image" if has_media => { // Show animation while image is loading, Drop stops it automatically - Ticker::start_ticking(core.get_sender()); let imgview = ImgView::new_from_file(core.clone(), &file.path())?; return Ok(PreviewWidget::ImgView(imgview)); @@ -505,9 +509,6 @@ impl Previewer { stale: &Stale, animator: &Stale) -> HResult { - // Show animation while text is loading - let mut ticker = Ticker::start_ticking(core.get_sender()); - let lines = core.coordinates.ysize() as usize; let mut textview @@ -521,8 +522,6 @@ impl Previewer { if stale.is_stale()? { return Previewer::preview_failed(&file) } - // Prevent flicker during slide up - ticker.stop_ticking(); textview.animate_slide_up(Some(animator))?; Ok(PreviewWidget::TextView(textview)) } @@ -577,9 +576,6 @@ impl Previewer { stale: &Stale, animator: &Stale) -> HResult { - // Show animation while preview is being generated - let mut ticker = Ticker::start_ticking(core.get_sender()); - let previewer = if core.config().graphics.as_str() != "unicode" { find_previewer(&file, true)? } else { @@ -596,15 +592,13 @@ impl Previewer { textview.set_lines(lines)?; textview.set_coordinates(&core.coordinates).log(); textview.refresh().log(); - // Prevent flicker during slide up - ticker.stop_ticking(); textview.animate_slide_up(Some(animator)).log(); Ok(PreviewWidget::TextView(textview)) }, ExtPreviewer::Graphics(previewer) => { let lines = Previewer::run_external(previewer, file, stale)?; - let gfile = lines.first()?; + let gfile = lines.first().ok_or_else(|| HError::NoneError)?; let imgview = ImgView::new_from_file(core.clone(), &PathBuf::from(&gfile))?; Ok(PreviewWidget::ImgView(imgview)) diff --git a/src/proclist.rs b/src/proclist.rs index f82ffbb..e37de76 100644 --- a/src/proclist.rs +++ b/src/proclist.rs @@ -137,7 +137,7 @@ impl Process { let pid = self.handle.lock().id(); std::thread::spawn(move || -> HResult<()> { - let stdout = handle.lock().stdout.take()?; + let stdout = handle.lock().stdout.take().ok_or_else(|| HError::NoneError)?; let mut stdout = BufReader::new(stdout); let mut processor = move |cmd, sender: &Sender| -> HResult<()> { loop { @@ -363,7 +363,7 @@ impl ListView> { } fn kill_proc(&mut self) -> HResult<()> { - let proc = self.selected_proc()?; + let proc = self.selected_proc().ok_or_else(|| HError::NoneError)?; proc.handle.lock().kill()?; Ok(()) } @@ -531,7 +531,10 @@ impl ProcView { if Some(self.get_listview_mut().get_selection()) == self.viewing { return Ok(()); } - let output = self.get_listview_mut().selected_proc()?.output.lock().clone(); + let output = self.get_listview_mut() + .selected_proc() + .ok_or_else(|| HError::NoneError)? + .output.lock().clone(); let animator = self.animator.clone(); animator.set_fresh().log(); diff --git a/src/quick_actions.rs b/src/quick_actions.rs index 2257b86..e7bc390 100644 --- a/src/quick_actions.rs +++ b/src/quick_actions.rs @@ -61,7 +61,7 @@ impl FoldableWidgetExt for ListView> { } fn render_header(&self) -> HResult { - let mime = &self.content.get(0)?.mime; + let mime = &self.content.get(0).ok_or_else(|| HError::NoneError)?.mime; Ok(format!("QuickActions for MIME: {}", mime)) } @@ -154,7 +154,7 @@ impl ListView> { fn run_action(&mut self, num: Option) -> HResult<()> { num.map(|num| self.set_selection(num)); - let current_fold = self.current_fold()?; + let current_fold = self.current_fold().ok_or_else(|| HError::NoneError)?; let fold_start_pos = self.fold_start_pos(current_fold); let selection = self.get_selection(); let selected_action_index = selection - fold_start_pos; @@ -390,7 +390,7 @@ impl QuickAction { } })?; - let cwd = files.get(0)?.parent_as_file()?; + let cwd = files.get(0).ok_or_else(|| HError::NoneError)?.parent_as_file()?; let files: Vec = files.iter() .map(|f| OsString::from(&f.path)) diff --git a/src/stats.rs b/src/stats.rs index 4fc3539..83a8820 100644 --- a/src/stats.rs +++ b/src/stats.rs @@ -4,7 +4,7 @@ use systemstat::data::Filesystem; use std::path::{Path, PathBuf, Component}; use std::collections::HashMap; -use crate::fail::{HResult, ErrorLog}; +use crate::fail::{HResult, ErrorLog, HError}; #[derive(Debug,Clone)] pub struct FsStat { @@ -52,7 +52,7 @@ impl FsStat { } deepest }); - let fs = self.stats.get(&deepest_match)?; + let fs = self.stats.get(&deepest_match).ok_or_else(|| HError::NoneError)?; Ok(fs) } } diff --git a/src/tabview.rs b/src/tabview.rs index 388740f..6399b30 100644 --- a/src/tabview.rs +++ b/src/tabview.rs @@ -54,7 +54,7 @@ impl TabView where T: Widget, TabView: Tabbable { } pub fn pop_widget(&mut self) -> HResult { - let widget = self.widgets.pop()?; + let widget = self.widgets.pop().ok_or_else(|| HError::NoneError)?; if self.widgets.len() <= self.active { self.active -= 1; } diff --git a/src/term.rs b/src/term.rs index 2ae0b6a..81dc5f6 100644 --- a/src/term.rs +++ b/src/term.rs @@ -9,7 +9,7 @@ use parse_ansi::parse_bytes; use crate::unicode_width::{UnicodeWidthStr, UnicodeWidthChar}; use parking_lot::{Mutex, RwLock}; -use crate::fail::{HResult, ErrorLog}; +use crate::fail::{HResult, ErrorLog, HError}; use crate::trait_ext::ExtractResult; pub type TermMode = AlternateScreen>>; @@ -52,7 +52,7 @@ impl Screen { } pub fn take_size(&self) -> HResult<(usize, usize)> { - Ok(self.size.write().take()?) + Ok(self.size.write().take().ok_or_else(|| HError::NoneError)?) } pub fn set_title(&mut self, title: &str) -> HResult<()> { diff --git a/src/widget.rs b/src/widget.rs index 904e3e8..bbcbf70 100644 --- a/src/widget.rs +++ b/src/widget.rs @@ -139,7 +139,8 @@ impl WidgetCore { pub fn minibuffer_clear(&self) -> HResult<()> { self.minibuffer .lock() - .as_mut()? + .as_mut() + .ok_or_else(|| HError::NoneError)? .clear(); Ok(()) @@ -148,7 +149,8 @@ impl WidgetCore { pub fn minibuffer(&self, query: &str) -> HResult { let answer = self.minibuffer .lock() - .as_mut()? + .as_mut() + .ok_or_else(|| HError::NoneError)? .query(query, false); let mut screen = self.screen()?; screen.cursor_hide().log(); @@ -158,7 +160,8 @@ impl WidgetCore { pub fn minibuffer_continuous(&self, query: &str) -> HResult { let answer = self.minibuffer .lock() - .as_mut()? + .as_mut() + .ok_or_else(|| HError::NoneError)? .query(query, true); let mut screen = self.screen()?; screen.cursor_hide().log(); @@ -452,7 +455,7 @@ pub trait Widget { self.set_coordinates(&ani_coords).log(); let buffer = self.get_drawlist()?; - if !animator.as_ref()?.is_stale()? { + if !animator.as_ref().ok_or_else(|| HError::NoneError)?.is_stale()? { self.get_core()?.write_to_screen(&buffer).log(); } @@ -476,7 +479,7 @@ pub trait Widget { fn handle_input(&mut self) -> HResult<()> { let (tx_internal_event, rx_internal_event) = channel(); - let rx_global_event = self.get_core()?.event_receiver.lock().take()?; + let rx_global_event = self.get_core()?.event_receiver.lock().take().ok_or_else(|| HError::NoneError)?; dispatch_events(tx_internal_event, rx_global_event, self.get_core()?.screen()?);