summaryrefslogtreecommitdiffstats
path: root/src/commands/search_glob.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/commands/search_glob.rs')
-rw-r--r--src/commands/search_glob.rs56
1 files changed, 18 insertions, 38 deletions
diff --git a/src/commands/search_glob.rs b/src/commands/search_glob.rs
index 30962c1..c833b8e 100644
--- a/src/commands/search_glob.rs
+++ b/src/commands/search_glob.rs
@@ -1,49 +1,29 @@
-use globset::{GlobBuilder, GlobMatcher};
-
-use crate::context::AppContext;
+use crate::context::{AppContext, MatchContext};
use crate::error::JoshutoResult;
-use crate::tab::JoshutoTab;
-use crate::util::search::SearchPattern;
use super::cursor_move;
+use super::search;
-pub fn search_glob_fwd(curr_tab: &JoshutoTab, glob: &GlobMatcher) -> Option<usize> {
- let curr_list = curr_tab.curr_list_ref()?;
+pub fn search_glob(context: &mut AppContext, pattern: &str) -> JoshutoResult {
+ let case_sensitivity = context
+ .config_ref()
+ .search_options_ref()
+ .glob_case_sensitivity;
- let offset = curr_list.get_index()? + 1;
- let contents_len = curr_list.len();
- for i in 0..contents_len {
- let file_name = curr_list.contents[(offset + i) % contents_len].file_name();
- if glob.is_match(file_name) {
- return Some((offset + i) % contents_len);
- }
- }
- None
-}
-pub fn search_glob_rev(curr_tab: &JoshutoTab, glob: &GlobMatcher) -> Option<usize> {
- let curr_list = curr_tab.curr_list_ref()?;
+ let search_context = MatchContext::new_glob(pattern, case_sensitivity)?;
- let offset = curr_list.get_index()?;
- let contents_len = curr_list.len();
- for i in (0..contents_len).rev() {
- let file_name = curr_list.contents[(offset + i) % contents_len].file_name();
- if glob.is_match(file_name) {
- return Some((offset + i) % contents_len);
- }
- }
- None
-}
+ let curr_tab = &context.tab_context_ref().curr_tab_ref();
+ let index = curr_tab.curr_list_ref().and_then(|c| c.get_index());
-pub fn search_glob(context: &mut AppContext, pattern: &str) -> JoshutoResult {
- let glob = GlobBuilder::new(pattern)
- .case_insensitive(true)
- .build()?
- .compile_matcher();
+ let offset = match index {
+ Some(index) => index + 1,
+ None => return Ok(()),
+ };
- let index = search_glob_fwd(context.tab_context_ref().curr_tab_ref(), &glob);
- if let Some(index) = index {
- cursor_move::cursor_move(context, index);
+ if let Some(new_index) = search::search_next_impl(curr_tab, &search_context, offset) {
+ cursor_move::cursor_move(context, new_index);
}
- context.set_search_context(SearchPattern::Glob(glob));
+
+ context.set_search_context(search_context);
Ok(())
}