Skip to content

Commit

Permalink
feat: add row numbers to rows
Browse files Browse the repository at this point in the history
  • Loading branch information
c-git committed Sep 9, 2024
1 parent 39407a6 commit 1d39bd5
Show file tree
Hide file tree
Showing 10 changed files with 304 additions and 29 deletions.
29 changes: 17 additions & 12 deletions src/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ pub struct LogViewerApp {
track_item_align: Option<Align>,
shortcuts: Shortcuts,
auto_scroll_to_end: bool,
// TODO 4: Add UI to set / unset field
/// When set adds a field with this name and populates it with the row numbers
pub row_idx_field_name: Option<String>,

#[serde(skip)]
should_focus_search: bool,
Expand All @@ -49,6 +52,7 @@ impl Default for LogViewerApp {
track_item_align: Default::default(),
shortcuts: Default::default(),
auto_scroll_to_end: Default::default(),
row_idx_field_name: Some("row#".to_string()),
should_focus_search: Default::default(),
should_scroll: Default::default(),
show_last_filename: true,
Expand Down Expand Up @@ -296,20 +300,21 @@ impl LogViewerApp {
ui.colored_label(ui.visuals().error_fg_color, msg);
}
LoadingStatus::Success(data) => {
self.loading_status = match Data::try_from(&data[..]) {
Ok(mut data) => {
if let Some(old_data) = self.data.as_mut() {
// Preserve filter across loads of the data
data.filter = old_data.filter.take();
}
self.data = Some(data);
if self.auto_scroll_to_end {
self.move_selected_last();
self.loading_status =
match Data::try_from((self.row_idx_field_name.as_ref(), &data[..])) {
Ok(mut data) => {
if let Some(old_data) = self.data.as_mut() {
// Preserve filter settings across loads of the data
data.filter = old_data.filter.take();
}
self.data = Some(data);
if self.auto_scroll_to_end {
self.move_selected_last();
}
LoadingStatus::NotInProgress
}
LoadingStatus::NotInProgress
Err(e) => LoadingStatus::Failed(format!("{e:?}")),
}
Err(e) => LoadingStatus::Failed(format!("{e:?}")),
}
}
}
}
Expand Down
31 changes: 23 additions & 8 deletions src/app/data.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,14 @@ use anyhow::Context;
use data_iter::DataIter;
use filter::{FieldSpecifier, FilterConfig};
use log::warn;
use serde_json::Value;

use super::calculate_hash;
mod data_iter;
pub mod filter;

type LogRowIdxFieldName<'a> = Option<&'a String>;

#[derive(serde::Deserialize, serde::Serialize, Default, Debug, PartialEq, Eq)]
#[serde(default)]
pub struct Data {
Expand All @@ -30,7 +33,6 @@ pub struct LogRow {

#[derive(Default, Debug, PartialEq, Eq, Clone)]
struct CachedDisplayInfo {
// TODO 1: Add row numbers to top section (optionally)
data: Vec<(String, String)>,
common_fields_hash: u64,
}
Expand Down Expand Up @@ -122,6 +124,11 @@ impl LogRow {
});
}
}

/// Adds the value passed at the key if the key does not exist
fn or_insert(&mut self, key: String, value: Value) {
self.data.entry(key).or_insert(value);
}
}

impl Data {
Expand Down Expand Up @@ -283,25 +290,33 @@ fn is_included(
}
}

impl TryFrom<&str> for LogRow {
impl TryFrom<(LogRowIdxFieldName<'_>, usize, &str)> for LogRow {
type Error = anyhow::Error;

fn try_from(value: &str) -> Result<Self, Self::Error> {
Ok(Self {
fn try_from(
(log_row_idx_key, row_idx_val, value): (LogRowIdxFieldName<'_>, usize, &str),
) -> Result<Self, Self::Error> {
let mut result = Self {
data: serde_json::from_str(value)?,
cached_display_list: None,
})
};
if let Some(key) = log_row_idx_key {
result.or_insert(key.to_string(), row_idx_val.into());
}
Ok(result)
}
}

impl TryFrom<&str> for Data {
impl TryFrom<(LogRowIdxFieldName<'_>, &str)> for Data {
type Error = anyhow::Error;

fn try_from(value: &str) -> Result<Self, Self::Error> {
fn try_from(
(log_row_idx_key, value): (LogRowIdxFieldName<'_>, &str),
) -> Result<Self, Self::Error> {
let mut result = Data::default();
for (i, line) in value.lines().enumerate() {
result.rows.push(
LogRow::try_from(line)
LogRow::try_from((log_row_idx_key, i, line))
.with_context(|| format!("failed to parse line {}", i + 1))?,
);
}
Expand Down
4 changes: 2 additions & 2 deletions src/app/data/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ pub(crate) fn insta_settings() -> insta::Settings {
fn deserialize_rows_from_string(insta_settings: insta::Settings) {
glob!(PATH_PROJECT_ROOT, PATH_TEST_SAMPLES, |path| {
let input = std::fs::read_to_string(path).unwrap();
let data = Data::try_from(&input[..]).unwrap();
let data = Data::try_from((Some(&"Test Row#".to_string()), &input[..])).unwrap();
let log_filename = path.file_name().unwrap().to_string_lossy().to_string();
insta_settings.bind(|| insta::assert_ron_snapshot!(format!("{log_filename}_ron"), data));
insta_settings.bind(|| insta::assert_yaml_snapshot!(format!("{log_filename}_yaml"), data));
Expand All @@ -58,7 +58,7 @@ fn round_trip_from_samples(#[case] serde_format: SerdeFormat) {

glob!(PATH_PROJECT_ROOT, PATH_TEST_SAMPLES, |path| {
let input = std::fs::read_to_string(path).unwrap();
let rows_before = Data::try_from(&input[..]).unwrap();
let rows_before = Data::try_from((Some(&"Test Row#".to_string()), &input[..])).unwrap();

// Test individual rows
for (i, row_before) in rows_before.rows_iter().enumerate() {
Expand Down
2 changes: 1 addition & 1 deletion src/app/data_display_options.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ impl Default for DataDisplayOptions {
fn default() -> Self {
Self {
// TODO 3: Add ability to show, select and reorder selected fields
main_list_fields: ["time", "request_id", "otel.name", "msg"]
main_list_fields: ["row#", "time", "request_id", "otel.name", "msg"]
.into_iter()
.map(String::from)
.collect(),
Expand Down
Loading

0 comments on commit 1d39bd5

Please sign in to comment.