Skip to content

Commit

Permalink
feat: support loading non-json lines
Browse files Browse the repository at this point in the history
  • Loading branch information
c-git committed Dec 29, 2024
1 parent 5442ef8 commit bb564f8
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 20 deletions.
34 changes: 15 additions & 19 deletions src/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -303,27 +303,23 @@ impl LogViewerApp {
ui.colored_label(ui.visuals().error_fg_color, msg);
}
LoadingStatus::Success(data) => {
self.loading_status =
// TODO 1: Make a copy of the loading type desired and match on it to get the data to load
match Data::try_from((&self.data_display_options, &data[..])) {
Ok(mut data) => {
if let Some(old_data) = self.data.as_mut() {
// Preserve settings across loads of the data
data.take_config(
old_data,
self.data_display_options.common_fields(),
);
}
self.data = Some(data);
if self.should_scroll_to_end_on_load {
self.move_selected_last();
} else {
self.should_scroll = true;
}
LoadingStatus::NotInProgress
self.loading_status = match Data::try_from((&self.data_display_options, &data[..]))
{
Ok(mut data) => {
if let Some(old_data) = self.data.as_mut() {
// Preserve settings across loads of the data
data.take_config(old_data, self.data_display_options.common_fields());
}
Err(e) => LoadingStatus::Failed(clean_msg(format!("{e:?}"))),
self.data = Some(data);
if self.should_scroll_to_end_on_load {
self.move_selected_last();
} else {
self.should_scroll = true;
}
LoadingStatus::NotInProgress
}
Err(e) => LoadingStatus::Failed(clean_msg(format!("{e:?}"))),
}
}
}
}
Expand Down
21 changes: 20 additions & 1 deletion src/app/data.rs
Original file line number Diff line number Diff line change
Expand Up @@ -364,8 +364,27 @@ impl TryFrom<(&DataDisplayOptions, usize, &str)> for LogRow {
fn try_from(
(data_display_options, row_idx_val, value): (&DataDisplayOptions, usize, &str),
) -> Result<Self, Self::Error> {
let data = match serde_json::from_str::<BTreeMap<String, Value>>(value) {
Ok(data) => data,
Err(e) => match &data_display_options.row_parse_error_handling {
super::data_display_options::RowParseErrorHandling::AbortOnAnyErrors => {
Err(e).context("Parse Error and mode is Abort On Error")?
}
super::data_display_options::RowParseErrorHandling::ConvertFailedLines {
raw_line_field_name,
parse_error_field_name,
} => {
let mut result = BTreeMap::new();
result.insert(raw_line_field_name.clone(), serde_json::json!(value));
if let Some(err_field) = parse_error_field_name {
result.insert(err_field.clone(), serde_json::json!(format!("{e:?}")));
}
result
}
},
};
let mut result = Self {
data: serde_json::from_str(value)?,
data,
cached_display_list: None,
};
if let Some(key) = data_display_options.row_idx_field_name.as_ref() {
Expand Down
23 changes: 23 additions & 0 deletions src/app/data_display_options.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,19 @@ pub struct DataDisplayOptions {

/// When set adds a field with this name and populates it with the row numbers
pub row_idx_field_name: Option<String>,

/// Controls how errors during file loading are treated
pub row_parse_error_handling: RowParseErrorHandling,
}

#[derive(serde::Deserialize, serde::Serialize, Debug, PartialEq, Eq)]
pub enum RowParseErrorHandling {
AbortOnAnyErrors,
ConvertFailedLines {
raw_line_field_name: String,
/// If set the error message from the failure is placed in this field
parse_error_field_name: Option<String>,
},
}

impl DataDisplayOptions {
Expand Down Expand Up @@ -63,6 +76,16 @@ impl Default for DataDisplayOptions {
.collect(),
emphasize_if_matching_field_idx: Some(2),
row_idx_field_name: Some("row#".to_string()),
row_parse_error_handling: Default::default(),
}
}
}

impl Default for RowParseErrorHandling {
fn default() -> Self {
Self::ConvertFailedLines {
raw_line_field_name: "msg".into(),
parse_error_field_name: Some("parse_err".into()),
}
}
}

0 comments on commit bb564f8

Please sign in to comment.