return values visualized

This commit is contained in:
Jana Dönszelmann 2026-02-24 23:55:25 +01:00
parent 5c6ced8ca0
commit 7d149ee17e
No known key found for this signature in database
3 changed files with 44 additions and 24 deletions

View file

@ -182,7 +182,22 @@ impl LogViewer {
pub fn footer_fields(&self) -> Vec<(String, serde_json::Value)> { pub fn footer_fields(&self) -> Vec<(String, serde_json::Value)> {
if let Some((selected, _)) = self.selected() { if let Some((selected, _)) = self.selected() {
selected.all_fields().fields.into_iter().collect::<Vec<_>>() 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::<Vec<_>>()
} else { } else {
Vec::new() Vec::new()
} }

View file

@ -1,6 +1,5 @@
use itertools::Itertools; use itertools::Itertools;
use ratatui_themes::{Theme, ThemeName}; use ratatui_themes::{Theme, ThemeName};
use serde_json::de;
use std::{ use std::{
fs::{self, DirEntry}, fs::{self, DirEntry},
io, io,
@ -24,7 +23,7 @@ use ratatui::{
crossterm::event::{self, Event, KeyCode, KeyModifiers}, crossterm::event::{self, Event, KeyCode, KeyModifiers},
layout::{Constraint, HorizontalAlignment, Layout, Rect}, layout::{Constraint, HorizontalAlignment, Layout, Rect},
style::Style, style::Style,
text::{Line, Span, Text}, text::{Line, Text},
widgets::{ widgets::{
Block, Clear, List, ListItem, ListState, Padding, Paragraph, StatefulWidget, Widget, Wrap, Block, Clear, List, ListItem, ListState, Padding, Paragraph, StatefulWidget, Widget, Wrap,
}, },
@ -231,7 +230,7 @@ impl App {
}, },
(KeyCode::Char('g') | KeyCode::End, tab) => match tab { (KeyCode::Char('g') | KeyCode::End, tab) => match tab {
Tab::FileChooser { state, .. } => state.select_last(), Tab::FileChooser { state, .. } => state.select_last(),
Tab::LogViewer(lv) => {} Tab::LogViewer(_) => {}
Tab::Empty => {} Tab::Empty => {}
Tab::CreateFilter { .. } => {} Tab::CreateFilter { .. } => {}
}, },
@ -252,16 +251,12 @@ impl App {
lv.switch_focus(); lv.switch_focus();
} }
(KeyCode::Char('r'), Tab::LogViewer(lv)) => { (KeyCode::Char('r'), Tab::LogViewer(lv)) => {
if let Some(file) = &mut self.current_file { let filter = initialize_filter(lv, Some(FilterKind::Remove));
let filter = initialize_filter(lv, Some(FilterKind::Remove)); self.push_tab(Tab::CreateFilter { filter });
self.push_tab(Tab::CreateFilter { filter });
}
} }
(KeyCode::Char('i'), Tab::LogViewer(lv)) => { (KeyCode::Char('i'), Tab::LogViewer(lv)) => {
if let Some(file) = &mut self.current_file { let filter = initialize_filter(lv, Some(FilterKind::Inline));
let filter = initialize_filter(lv, Some(FilterKind::Inline)); self.push_tab(Tab::CreateFilter { filter });
self.push_tab(Tab::CreateFilter { filter });
}
} }
(KeyCode::Enter, tab) => match tab { (KeyCode::Enter, tab) => match tab {
Tab::FileChooser { files, state, .. } => { Tab::FileChooser { files, state, .. } => {
@ -273,7 +268,7 @@ impl App {
self.current_file = Some(i.clone()); self.current_file = Some(i.clone());
self.replace_tab(Tab::LogViewer(LogViewer::new(i.iter()))); self.replace_tab(Tab::LogViewer(LogViewer::new(i.iter())));
} }
Err(e) => { Err(_) => {
panic!() panic!()
} }
} }
@ -370,7 +365,7 @@ impl Widget for &mut App {
}; };
let footer_area = { let footer_area = {
let mut block = Block::bordered() let block = Block::bordered()
.style(default) .style(default)
.border_style(if footer_focused { .border_style(if footer_focused {
border_selected border_selected

View file

@ -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 { pub fn count(&self) -> usize {
match self { match self {
LogEntry::Single { .. } => 1, LogEntry::Single { .. } => 1,
@ -93,12 +100,19 @@ impl LogEntry {
const NO_MESSAGE: &str = "<no message>"; const NO_MESSAGE: &str = "<no message>";
const SPACES_BEFORE: &str = " "; const SPACES_BEFORE: &str = " ";
let indent = " >".repeat(inline_depth); 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 { match self {
LogEntry::Single { raw } => format!( LogEntry::Single { raw } => {
"{SPACES_BEFORE}┃{indent}{}", format!("{SPACES_BEFORE}{indent}{}", single_field(raw)).into()
raw.fields.message().unwrap_or(NO_MESSAGE) }
)
.into(),
LogEntry::Sub { LogEntry::Sub {
enter, sub_entries, .. enter, sub_entries, ..
} => { } => {
@ -111,11 +125,7 @@ impl LogEntry {
self.count().wrapping_sub(1) self.count().wrapping_sub(1)
)) ))
} else { } else {
format!( format!("{SPACES_BEFORE}{indent}{}", single_field(enter)).into()
"{SPACES_BEFORE}┃{indent}{}",
enter.fields.message().unwrap_or(NO_MESSAGE)
)
.into()
} }
} }
} }