summaryrefslogtreecommitdiffstats
path: root/src/skim.rs
diff options
context:
space:
mode:
authorqkzk <qu3nt1n@gmail.com>2023-11-01 21:35:54 +0100
committerqkzk <qu3nt1n@gmail.com>2023-11-01 21:35:54 +0100
commitb5b78246398c0cbded52aaa5373c9e09296679b3 (patch)
tree4f457e202ded03cd8a0e668d8b877101bec01225 /src/skim.rs
parent51cbf2f733a1c1e6352f0643829c61dcd693d367 (diff)
don't crash the app if skim can't be initialized. Improve skim
Diffstat (limited to 'src/skim.rs')
-rw-r--r--src/skim.rs21
1 files changed, 10 insertions, 11 deletions
diff --git a/src/skim.rs b/src/skim.rs
index 5a0c012..ba84a13 100644
--- a/src/skim.rs
+++ b/src/skim.rs
@@ -1,3 +1,4 @@
+use anyhow::{Context, Result};
use skim::prelude::*;
use tuikit::term::Term;
@@ -10,24 +11,22 @@ use crate::utils::is_program_in_path;
/// It's a simple wrapper around `Skim` which is used to simplify the interface.
pub struct Skimer {
skim: Skim,
- previewer: String,
- file_matcher: String,
+ previewer: &'static str,
+ file_matcher: &'static str,
}
impl Skimer {
/// Creates a new `Skimer` instance.
/// `term` is an `Arc<term>` clone of the default term.
/// It tries to preview with `bat`, but choose `cat` if it can't.
- pub fn new(term: Arc<Term>) -> Self {
- Self {
+ pub fn new(term: Arc<Term>) -> Result<Self> {
+ Ok(Self {
skim: Skim::new_from_term(term),
previewer: pick_first_installed(&[BAT_EXECUTABLE, CAT_EXECUTABLE])
- .expect("Skimer new: at least a previewer should be installed")
- .to_owned(),
+ .context("Neither bat nor cat are installed")?,
file_matcher: pick_first_installed(&[RG_EXECUTABLE, GREP_EXECUTABLE])
- .expect("Skimer new: at least a line matcher should be installed")
- .to_owned(),
- }
+ .context("Neither ripgrep nor grep are installed")?,
+ })
}
/// Call skim on its term.
@@ -38,7 +37,7 @@ impl Skimer {
pub fn search_filename(&self, path_str: &str) -> Vec<Arc<dyn SkimItem>> {
let Some(output) =
self.skim
- .run_internal(None, path_str.to_owned(), Some(&self.previewer), None)
+ .run_internal(None, path_str.to_owned(), Some(self.previewer), None)
else {
return vec![];
};
@@ -69,7 +68,7 @@ impl Skimer {
/// Search in a text content, splitted by line.
/// Returns the selected line.
- pub fn search_in_text(&self, text: String) -> Vec<Arc<dyn SkimItem>> {
+ pub fn search_in_text(&self, text: &str) -> Vec<Arc<dyn SkimItem>> {
let (tx_item, rx_item): (SkimItemSender, SkimItemReceiver) = unbounded();
for line in text.lines().rev() {
let _ = tx_item.send(Arc::new(StringWrapper {