Skip to content

Commit bb564f8

Browse files
committed
feat: support loading non-json lines
1 parent 5442ef8 commit bb564f8

File tree

3 files changed

+58
-20
lines changed

3 files changed

+58
-20
lines changed

src/app.rs

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -303,27 +303,23 @@ impl LogViewerApp {
303303
ui.colored_label(ui.visuals().error_fg_color, msg);
304304
}
305305
LoadingStatus::Success(data) => {
306-
self.loading_status =
307-
// TODO 1: Make a copy of the loading type desired and match on it to get the data to load
308-
match Data::try_from((&self.data_display_options, &data[..])) {
309-
Ok(mut data) => {
310-
if let Some(old_data) = self.data.as_mut() {
311-
// Preserve settings across loads of the data
312-
data.take_config(
313-
old_data,
314-
self.data_display_options.common_fields(),
315-
);
316-
}
317-
self.data = Some(data);
318-
if self.should_scroll_to_end_on_load {
319-
self.move_selected_last();
320-
} else {
321-
self.should_scroll = true;
322-
}
323-
LoadingStatus::NotInProgress
306+
self.loading_status = match Data::try_from((&self.data_display_options, &data[..]))
307+
{
308+
Ok(mut data) => {
309+
if let Some(old_data) = self.data.as_mut() {
310+
// Preserve settings across loads of the data
311+
data.take_config(old_data, self.data_display_options.common_fields());
324312
}
325-
Err(e) => LoadingStatus::Failed(clean_msg(format!("{e:?}"))),
313+
self.data = Some(data);
314+
if self.should_scroll_to_end_on_load {
315+
self.move_selected_last();
316+
} else {
317+
self.should_scroll = true;
318+
}
319+
LoadingStatus::NotInProgress
326320
}
321+
Err(e) => LoadingStatus::Failed(clean_msg(format!("{e:?}"))),
322+
}
327323
}
328324
}
329325
}

src/app/data.rs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -364,8 +364,27 @@ impl TryFrom<(&DataDisplayOptions, usize, &str)> for LogRow {
364364
fn try_from(
365365
(data_display_options, row_idx_val, value): (&DataDisplayOptions, usize, &str),
366366
) -> Result<Self, Self::Error> {
367+
let data = match serde_json::from_str::<BTreeMap<String, Value>>(value) {
368+
Ok(data) => data,
369+
Err(e) => match &data_display_options.row_parse_error_handling {
370+
super::data_display_options::RowParseErrorHandling::AbortOnAnyErrors => {
371+
Err(e).context("Parse Error and mode is Abort On Error")?
372+
}
373+
super::data_display_options::RowParseErrorHandling::ConvertFailedLines {
374+
raw_line_field_name,
375+
parse_error_field_name,
376+
} => {
377+
let mut result = BTreeMap::new();
378+
result.insert(raw_line_field_name.clone(), serde_json::json!(value));
379+
if let Some(err_field) = parse_error_field_name {
380+
result.insert(err_field.clone(), serde_json::json!(format!("{e:?}")));
381+
}
382+
result
383+
}
384+
},
385+
};
367386
let mut result = Self {
368-
data: serde_json::from_str(value)?,
387+
data,
369388
cached_display_list: None,
370389
};
371390
if let Some(key) = data_display_options.row_idx_field_name.as_ref() {

src/app/data_display_options.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,19 @@ pub struct DataDisplayOptions {
1515

1616
/// When set adds a field with this name and populates it with the row numbers
1717
pub row_idx_field_name: Option<String>,
18+
19+
/// Controls how errors during file loading are treated
20+
pub row_parse_error_handling: RowParseErrorHandling,
21+
}
22+
23+
#[derive(serde::Deserialize, serde::Serialize, Debug, PartialEq, Eq)]
24+
pub enum RowParseErrorHandling {
25+
AbortOnAnyErrors,
26+
ConvertFailedLines {
27+
raw_line_field_name: String,
28+
/// If set the error message from the failure is placed in this field
29+
parse_error_field_name: Option<String>,
30+
},
1831
}
1932

2033
impl DataDisplayOptions {
@@ -63,6 +76,16 @@ impl Default for DataDisplayOptions {
6376
.collect(),
6477
emphasize_if_matching_field_idx: Some(2),
6578
row_idx_field_name: Some("row#".to_string()),
79+
row_parse_error_handling: Default::default(),
80+
}
81+
}
82+
}
83+
84+
impl Default for RowParseErrorHandling {
85+
fn default() -> Self {
86+
Self::ConvertFailedLines {
87+
raw_line_field_name: "msg".into(),
88+
parse_error_field_name: Some("parse_err".into()),
6689
}
6790
}
6891
}

0 commit comments

Comments
 (0)