mqv/msgs.go
Pierre-Olivier Mercier 5afabd0255 Add parts screen with per-part view and save
Adds a `stateParts` screen (v from message view) listing all MIME leaf
parts in a table with content-type, name, and size. Navigation with
↑↓/j/k, Enter to render text/* parts in a scrollable viewport
(statePartView), s to save any part to the current directory with a
prompted filename defaulting to the part's name.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-29 19:33:21 +07:00

75 lines
1.9 KiB
Go

package main
import (
tea "github.com/charmbracelet/bubbletea"
)
// ── Tea message types ─────────────────────────────────────────────────────────
type queueParsedMsg struct{ entries []QueueEntry } // phase 1: structure only
type subjectFetchedMsg struct { // phase 2: one per entry
id string
subject string
}
type queueErrMsg struct{ err error }
type messageLoadedMsg struct {
id string
content string
}
type messageErrMsg struct{ err error }
type savedMsg struct{ path string }
type saveErrMsg struct{ err error }
type partSavedMsg struct{ path string }
type partSaveErrMsg struct{ err error }
// ── Tea commands ──────────────────────────────────────────────────────────────
func loadQueueCmd() tea.Cmd {
return func() tea.Msg {
entries, err := loadQueue()
if err != nil {
return queueErrMsg{err}
}
return queueParsedMsg{entries}
}
}
func fetchSubjectCmd(id string) tea.Cmd {
return func() tea.Msg {
raw, err := fetchHeaders(id)
if err != nil {
return subjectFetchedMsg{id: id, subject: "(error)"}
}
return subjectFetchedMsg{id: id, subject: extractSubject(raw)}
}
}
func loadMessageCmd(id string) tea.Cmd {
return func() tea.Msg {
content, err := fetchMessage(id)
if err != nil {
return messageErrMsg{err}
}
return messageLoadedMsg{id: id, content: content}
}
}
func saveCmd(id, content string) tea.Cmd {
return func() tea.Msg {
path, err := saveMessage(id, content)
if err != nil {
return saveErrMsg{err}
}
return savedMsg{path}
}
}
func savePartCmd(data []byte, name string) tea.Cmd {
return func() tea.Msg {
path, err := savePart(data, name)
if err != nil {
return partSaveErrMsg{err}
}
return partSavedMsg{path}
}
}