return values visualized
This commit is contained in:
parent
5c6ced8ca0
commit
7d149ee17e
3 changed files with 44 additions and 24 deletions
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,17 +251,13 @@ 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, .. } => {
|
||||||
if let Some(selected) = state.selected()
|
if let Some(selected) = state.selected()
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue