diff --git a/src/tui/log_viewer.rs b/src/tui/log_viewer.rs index 0eed263..7cf02cd 100644 --- a/src/tui/log_viewer.rs +++ b/src/tui/log_viewer.rs @@ -182,7 +182,22 @@ impl LogViewer { pub fn footer_fields(&self) -> Vec<(String, serde_json::Value)> { if let Some((selected, _)) = self.selected() { - selected.all_fields().fields.into_iter().collect::>() + let ret = match selected.as_ref() { + LogEntry::Single { .. } => Default::default(), + LogEntry::Sub { sub_entries, .. } => sub_entries.last().and_then(|i| { + i.all_fields() + .fields + .get_key_value("return") + .map(|(k, v)| (k.clone(), v.clone())) + }), + }; + + selected + .all_relevant_fields() + .fields + .into_iter() + .chain(ret) + .collect::>() } else { Vec::new() } diff --git a/src/tui/mod.rs b/src/tui/mod.rs index 09b9b86..70b1ca8 100644 --- a/src/tui/mod.rs +++ b/src/tui/mod.rs @@ -1,6 +1,5 @@ use itertools::Itertools; use ratatui_themes::{Theme, ThemeName}; -use serde_json::de; use std::{ fs::{self, DirEntry}, io, @@ -24,7 +23,7 @@ use ratatui::{ crossterm::event::{self, Event, KeyCode, KeyModifiers}, layout::{Constraint, HorizontalAlignment, Layout, Rect}, style::Style, - text::{Line, Span, Text}, + text::{Line, Text}, widgets::{ Block, Clear, List, ListItem, ListState, Padding, Paragraph, StatefulWidget, Widget, Wrap, }, @@ -231,7 +230,7 @@ impl App { }, (KeyCode::Char('g') | KeyCode::End, tab) => match tab { Tab::FileChooser { state, .. } => state.select_last(), - Tab::LogViewer(lv) => {} + Tab::LogViewer(_) => {} Tab::Empty => {} Tab::CreateFilter { .. } => {} }, @@ -252,16 +251,12 @@ impl App { lv.switch_focus(); } (KeyCode::Char('r'), Tab::LogViewer(lv)) => { - if let Some(file) = &mut self.current_file { - let filter = initialize_filter(lv, Some(FilterKind::Remove)); - self.push_tab(Tab::CreateFilter { filter }); - } + let filter = initialize_filter(lv, Some(FilterKind::Remove)); + self.push_tab(Tab::CreateFilter { filter }); } (KeyCode::Char('i'), Tab::LogViewer(lv)) => { - if let Some(file) = &mut self.current_file { - let filter = initialize_filter(lv, Some(FilterKind::Inline)); - self.push_tab(Tab::CreateFilter { filter }); - } + let filter = initialize_filter(lv, Some(FilterKind::Inline)); + self.push_tab(Tab::CreateFilter { filter }); } (KeyCode::Enter, tab) => match tab { Tab::FileChooser { files, state, .. } => { @@ -273,7 +268,7 @@ impl App { self.current_file = Some(i.clone()); self.replace_tab(Tab::LogViewer(LogViewer::new(i.iter()))); } - Err(e) => { + Err(_) => { panic!() } } @@ -370,7 +365,7 @@ impl Widget for &mut App { }; let footer_area = { - let mut block = Block::bordered() + let block = Block::bordered() .style(default) .border_style(if footer_focused { border_selected diff --git a/src/tui/model.rs b/src/tui/model.rs index f90f685..7c9ef87 100644 --- a/src/tui/model.rs +++ b/src/tui/model.rs @@ -76,6 +76,13 @@ impl LogEntry { } } + pub fn all_relevant_fields(&self) -> LogFields { + let mut res = self.all_fields(); + res.fields + .retain(|k, v| !(k == "message" && (v == "enter" || v == "exit"))); + res + } + pub fn count(&self) -> usize { match self { LogEntry::Single { .. } => 1, @@ -93,12 +100,19 @@ impl LogEntry { const NO_MESSAGE: &str = ""; const SPACES_BEFORE: &str = " "; let indent = " >".repeat(inline_depth); + + let single_field = |raw: &RawLogEntry| { + raw.fields + .message() + .map(|i| i.to_string()) + .or_else(|| raw.fields.fields.get("return").map(|i| format!("↩ {i}"))) + .unwrap_or_else(|| NO_MESSAGE.to_string()) + }; + match self { - LogEntry::Single { raw } => format!( - "{SPACES_BEFORE}┃{indent}{}", - raw.fields.message().unwrap_or(NO_MESSAGE) - ) - .into(), + LogEntry::Single { raw } => { + format!("{SPACES_BEFORE}┃{indent}{}", single_field(raw)).into() + } LogEntry::Sub { enter, sub_entries, .. } => { @@ -111,11 +125,7 @@ impl LogEntry { self.count().wrapping_sub(1) )) } else { - format!( - "{SPACES_BEFORE}┃{indent}{}", - enter.fields.message().unwrap_or(NO_MESSAGE) - ) - .into() + format!("{SPACES_BEFORE}┃{indent}{}", single_field(enter)).into() } } }