summaryrefslogtreecommitdiff
path: root/internal/tui/eventstream
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-09 22:54:11 +0200
committerPaul Buetow <paul@buetow.org>2026-03-09 22:54:11 +0200
commitbcaa22111ac619e317f7adfd60a1fc6bd4db8d29 (patch)
treecef38740e879472b57961f2ddc9694773b202e2c /internal/tui/eventstream
parenteb53d7c881b6b8a513c1350736c5f5df770e4089 (diff)
tui: export filtered stream rows from global CSV action (task 364)
Diffstat (limited to 'internal/tui/eventstream')
-rw-r--r--internal/tui/eventstream/export.go55
1 files changed, 43 insertions, 12 deletions
diff --git a/internal/tui/eventstream/export.go b/internal/tui/eventstream/export.go
index 3924935..b9ddddc 100644
--- a/internal/tui/eventstream/export.go
+++ b/internal/tui/eventstream/export.go
@@ -15,25 +15,35 @@ func defaultStreamExportFilename() string {
return fmt.Sprintf("ior-stream-%s.csv", time.Now().Format("20060102-150405"))
}
-func ensureCSVFilename(name string) (string, error) {
- clean := strings.TrimSpace(name)
- if clean == "" {
- return "", errors.New("filename cannot be empty")
+func exportSnapshotToCSV(source Source, filter Filter, exportDir, filename string) (string, error) {
+ name := strings.TrimSpace(filename)
+ if name == "" {
+ name = defaultStreamExportFilename()
}
- if strings.HasSuffix(strings.ToLower(clean), ".csv") {
- return clean, nil
+
+ rows := make([]StreamEvent, 0)
+ if source != nil {
+ snapshot := source.Snapshot()
+ rows = make([]StreamEvent, 0, len(snapshot))
+ for i := range snapshot {
+ ev := snapshot[i]
+ if filter.Matches(&ev) {
+ rows = append(rows, ev)
+ }
+ }
}
- return clean + ".csv", nil
+
+ return exportRowsToCSV(rows, exportDir, name)
}
-func (m *Model) exportFilteredToCSV(filename string) (string, error) {
+func exportRowsToCSV(rows []StreamEvent, exportDir, filename string) (string, error) {
name, err := ensureCSVFilename(filename)
if err != nil {
return "", err
}
path := name
- if m.exportDir != "" {
- path = filepath.Join(m.exportDir, name)
+ if exportDir != "" {
+ path = filepath.Join(exportDir, name)
}
f, err := os.Create(path)
@@ -61,8 +71,8 @@ func (m *Model) exportFilteredToCSV(filename string) (string, error) {
if err := w.Write(header); err != nil {
return fail(err)
}
- for i := range m.filtered {
- ev := m.filtered[i]
+ for i := range rows {
+ ev := rows[i]
record := []string{
fmt.Sprintf("%d", ev.Seq),
fmt.Sprintf("%d", ev.TimeNs),
@@ -96,6 +106,27 @@ func (m *Model) exportFilteredToCSV(filename string) (string, error) {
return absPath, nil
}
+func ensureCSVFilename(name string) (string, error) {
+ clean := strings.TrimSpace(name)
+ if clean == "" {
+ return "", errors.New("filename cannot be empty")
+ }
+ if strings.HasSuffix(strings.ToLower(clean), ".csv") {
+ return clean, nil
+ }
+ return clean + ".csv", nil
+}
+
+// ExportSnapshotToCSV exports a fresh filtered snapshot from the current source
+// without mutating the model's paused/live view state.
+func (m Model) ExportSnapshotToCSV(filename string) (string, error) {
+ return exportSnapshotToCSV(m.source, m.filter, m.exportDir, filename)
+}
+
+func (m *Model) exportFilteredToCSV(filename string) (string, error) {
+ return exportRowsToCSV(m.filtered, m.exportDir, filename)
+}
+
// EditorCommandForPath builds an editor command for the given path.
func EditorCommandForPath(path string) (*exec.Cmd, error) {
parts, _, err := resolveEditorCommand()