Skip to content

Commit 6790c4a

Browse files
committed
Display output on empty input
1 parent 8f0c5a8 commit 6790c4a

File tree

1 file changed

+53
-14
lines changed

1 file changed

+53
-14
lines changed

src/state.rs

Lines changed: 53 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,52 @@
1-
use fuse_rust::SearchResult;
1+
use either::Either;
2+
use fuse_rust::{Fuse, SearchResult};
23

34
use crate::draw::ListItem;
45
use crate::input::KeyPress;
56
use crate::mode::Mode;
67

8+
struct Preprocessed(Either<Vec<SearchResult>, usize>);
9+
10+
impl Preprocessed {
11+
fn processed(processed: Vec<SearchResult>) -> Self {
12+
Self(Either::Left(processed))
13+
}
14+
15+
fn unfiltred(len: usize) -> Self {
16+
Self(Either::Right(len))
17+
}
18+
19+
fn len(&self) -> usize {
20+
match self {
21+
Self(Either::Left(x)) => x.len(),
22+
Self(Either::Right(x)) => *x,
23+
}
24+
}
25+
26+
fn index(&self, selected_item: usize) -> usize {
27+
if selected_item >= self.len() {
28+
panic!("Internal error: selected_item overflow");
29+
}
30+
31+
match self {
32+
Self(Either::Left(x)) => x[selected_item].index,
33+
Self(Either::Right(_)) => selected_item,
34+
}
35+
}
36+
37+
fn list_items<'s, 'm: 's>(&'s self, mode: &'m Mode) -> impl Iterator<Item = ListItem<'_>> + '_ {
38+
match self {
39+
Self(Either::Left(x)) => Either::Left(x.iter().map(move |r| mode.list_item(r.index))),
40+
Self(Either::Right(x)) => Either::Right((0..*x).map(move |i| mode.list_item(i))),
41+
}
42+
.into_iter()
43+
}
44+
}
45+
746
pub struct State {
847
input_buf: String,
948
selected_item: usize,
10-
processed_entries: Vec<SearchResult>,
49+
preprocessed: Preprocessed,
1150
inner: Mode,
1251
}
1352

@@ -16,7 +55,7 @@ impl State {
1655
Self {
1756
input_buf: String::new(),
1857
selected_item: 0,
19-
processed_entries: vec![],
58+
preprocessed: Preprocessed::unfiltred(inner.entries_len()),
2059
inner,
2160
}
2261
}
@@ -47,11 +86,7 @@ impl State {
4786
keysym: keysyms::XKB_KEY_Return,
4887
..
4988
} => {
50-
if self.selected_item >= self.processed_entries.len() {
51-
panic!("Internal error: selected_item overflow");
52-
}
53-
self.inner
54-
.eval(self.processed_entries[self.selected_item].index);
89+
self.inner.eval(self.preprocessed.index(self.selected_item));
5590
}
5691
KeyPress {
5792
keysym: keysyms::XKB_KEY_bracketright,
@@ -75,17 +110,21 @@ impl State {
75110
}
76111

77112
pub fn processed_entries(&self) -> impl Iterator<Item = ListItem<'_>> {
78-
self.processed_entries
79-
.iter()
80-
.map(move |r| self.inner.list_item(r.index))
113+
self.preprocessed.list_items(&self.inner)
81114
}
82115

83116
pub fn process_entries(&mut self) {
84-
self.processed_entries = fuse_rust::Fuse::default()
85-
.search_text_in_iterable(&self.input_buf, self.inner.text_entries());
117+
if self.input_buf.is_empty() {
118+
self.preprocessed = Preprocessed::unfiltred(self.inner.entries_len());
119+
return;
120+
}
121+
122+
self.preprocessed = Preprocessed::processed(
123+
Fuse::default().search_text_in_iterable(&self.input_buf, self.inner.text_entries()),
124+
);
86125

87126
self.selected_item = self
88-
.processed_entries
127+
.preprocessed
89128
.len()
90129
.saturating_sub(1)
91130
.min(self.selected_item);

0 commit comments

Comments
 (0)