Skip to content

Commit b363b9d

Browse files
committed
feat: allow case insensitive matches
1 parent 5068b01 commit b363b9d

File tree

5 files changed

+39
-9
lines changed

5 files changed

+39
-9
lines changed

src/app.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -503,6 +503,7 @@ impl LogViewerApp {
503503
let FilterConfig {
504504
search_key,
505505
filter_on,
506+
is_case_sensitive,
506507
comparator,
507508
} = filter;
508509
ui.label("Search Key: ");
@@ -512,6 +513,9 @@ impl LogViewerApp {
512513
should_apply_filter = true;
513514
}
514515

516+
ui.spacing();
517+
ui.checkbox(is_case_sensitive, "Case Sensitive");
518+
515519
ui.spacing();
516520
egui::ComboBox::from_label("")
517521
.selected_text(format!("{}", comparator))

src/app/data.rs

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
use std::collections::{BTreeMap, BTreeSet};
1+
use std::{
2+
borrow::Cow,
3+
collections::{BTreeMap, BTreeSet},
4+
};
25

36
use anyhow::Context;
47
use data_iter::DataIter;
@@ -16,7 +19,7 @@ pub mod filter;
1619
#[serde(default)]
1720
pub struct Data {
1821
pub selected_row: Option<usize>,
19-
pub filter: Option<filter::FilterConfig>,
22+
pub filter: Option<FilterConfig>,
2023
rows: Vec<LogRow>,
2124
filtered_rows: Option<Vec<usize>>,
2225
}
@@ -137,6 +140,7 @@ impl Data {
137140
}
138141

139142
pub fn move_selected_to_next(&mut self) {
143+
// TODO 1: Fix index values used
140144
if let Some(selected) = self.selected_row.as_mut() {
141145
if *selected < self.rows.len() - 1 {
142146
*selected += 1;
@@ -216,15 +220,36 @@ fn is_included(
216220
search_key,
217221
filter_on,
218222
comparator,
223+
is_case_sensitive,
219224
} = filter;
220225
let fields_and_values = row.as_slice(common_fields);
226+
let search_key = if *is_case_sensitive {
227+
search_key
228+
} else {
229+
&search_key.to_lowercase()
230+
};
231+
let mut iter = fields_and_values.iter().map(|(k, v)| {
232+
if *is_case_sensitive {
233+
(Cow::Borrowed(k), Cow::Borrowed(v))
234+
} else {
235+
(Cow::Owned(k.to_lowercase()), Cow::Owned(v.to_lowercase()))
236+
}
237+
});
238+
221239
match filter_on {
222-
filter::FilterOn::Any => fields_and_values
223-
.iter()
224-
.any(|(_, value)| comparator.apply(search_key, value)),
225-
filter::FilterOn::Field(FieldSpecifier { name }) => fields_and_values
226-
.iter()
227-
.any(|(field_name, value)| name == field_name && comparator.apply(search_key, value)),
240+
filter::FilterOn::Any => {
241+
iter.any(|(_, value)| comparator.apply(search_key, value.as_str()))
242+
}
243+
filter::FilterOn::Field(FieldSpecifier { name }) => {
244+
let name = if *is_case_sensitive {
245+
name
246+
} else {
247+
&name.to_lowercase()
248+
};
249+
iter.any(|(field_name, value)| {
250+
name == field_name.as_str() && comparator.apply(search_key, value.as_str())
251+
})
252+
}
228253
}
229254
}
230255

src/app/data/data_iter.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ mod tests {
4848
use super::*;
4949

5050
#[test]
51+
#[allow(clippy::iter_nth_zero)]
5152
fn nth_no_reverse() {
5253
let row0 = super::super::tests::create_log_row_no_extra();
5354
let row1 = super::super::tests::create_log_row_with_extra();

src/app/data/filter.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use std::fmt::Display;
55
pub struct FilterConfig {
66
pub search_key: String,
77
pub filter_on: FilterOn,
8+
pub is_case_sensitive: bool,
89
pub comparator: Comparator,
910
}
1011

src/lib.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,5 @@
33
mod app;
44
pub use app::LogViewerApp;
55

6-
// TODO 1: On enter apply filter
76
// TODO 3: Add button to set to current value if a field is selected
87
// TODO 3: Support auto reload (look into watching for changes) https://watchexec.github.io/

0 commit comments

Comments
 (0)