aboutsummaryrefslogtreecommitdiff
path: root/widgets/msgviewer.go
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2019-03-31 14:32:26 -0400
committerDrew DeVault <sir@cmpwn.com>2019-03-31 14:32:26 -0400
commitf9262e4b0600fcc83ddac642412769c2bce05c5c (patch)
tree0aae9562047da4a60acf7a73a48e5c59002487b3 /widgets/msgviewer.go
parentbbdf9df75e8597e38cf1d90145f22aab9bd95178 (diff)
Improve error handling in message viewer
Still not great but at least it tells you when something went wrong
Diffstat (limited to 'widgets/msgviewer.go')
-rw-r--r--widgets/msgviewer.go46
1 files changed, 36 insertions, 10 deletions
diff --git a/widgets/msgviewer.go b/widgets/msgviewer.go
index 3a3e962..67fd0cc 100644
--- a/widgets/msgviewer.go
+++ b/widgets/msgviewer.go
@@ -22,6 +22,7 @@ import (
type MessageViewer struct {
conf *config.AercConfig
+ err error
filter *exec.Cmd
msg *types.MessageInfo
pager *exec.Cmd
@@ -97,17 +98,19 @@ func NewMessageViewer(conf *config.AercConfig, store *lib.MessageStore,
pager *exec.Cmd
pipe io.WriteCloser
pagerin io.WriteCloser
+ term *Terminal
+ viewer *MessageViewer
)
cmd, err := shlex.Split(conf.Viewer.Pager)
if err != nil {
- panic(err) // TODO: something useful
+ goto handle_error
}
pager = exec.Command(cmd[0], cmd[1:]...)
for _, f := range conf.Filters {
- cmd, err := shlex.Split(f.Command)
+ cmd, err = shlex.Split(f.Command)
if err != nil {
- panic(err) // TODO: Something useful
+ goto handle_error
}
mime := msg.BodyStructure.MIMEType + "/" + msg.BodyStructure.MIMESubType
switch f.FilterType {
@@ -125,14 +128,14 @@ func NewMessageViewer(conf *config.AercConfig, store *lib.MessageStore,
pipe, _ = pager.StdinPipe()
}
- term, _ := NewTerminal(pager)
+ term, _ = NewTerminal(pager)
// TODO: configure multipart view. I left a spot for it in the grid
body.AddChild(term).At(0, 0).Span(1, 2)
grid.AddChild(headers).At(0, 0)
grid.AddChild(body).At(1, 0)
- viewer := &MessageViewer{
+ viewer = &MessageViewer{
filter: filter,
grid: grid,
msg: msg,
@@ -152,6 +155,14 @@ func NewMessageViewer(conf *config.AercConfig, store *lib.MessageStore,
}
return viewer
+
+handle_error:
+ viewer = &MessageViewer{
+ err: err,
+ grid: grid,
+ msg: msg,
+ }
+ return viewer
}
func (mv *MessageViewer) attemptCopy() {
@@ -167,20 +178,25 @@ func (mv *MessageViewer) attemptCopy() {
go func() {
_, err := io.Copy(mv.pagerin, stdout)
if err != nil {
- io.WriteString(mv.sink, err.Error())
+ mv.err = err
+ mv.Invalidate()
}
+ mv.pagerin.Close()
+ stdout.Close()
}()
}
go func() {
entity, err := message.New(header, mv.source)
if err != nil {
- io.WriteString(mv.sink, err.Error())
+ mv.err = err
+ mv.Invalidate()
return
}
reader := mail.NewReader(entity)
part, err := reader.NextPart()
if err != nil {
- io.WriteString(mv.sink, err.Error())
+ mv.err = err
+ mv.Invalidate()
return
}
io.Copy(mv.sink, part.Body)
@@ -190,6 +206,11 @@ func (mv *MessageViewer) attemptCopy() {
}
func (mv *MessageViewer) Draw(ctx *ui.Context) {
+ if mv.err != nil {
+ ctx.Fill(0, 0, ctx.Width(), ctx.Height(), ' ', tcell.StyleDefault)
+ ctx.Printf(0, 0, tcell.StyleDefault, "%s", mv.err.Error())
+ return
+ }
mv.grid.Draw(ctx)
}
@@ -204,11 +225,16 @@ func (mv *MessageViewer) OnInvalidate(fn func(d ui.Drawable)) {
}
func (mv *MessageViewer) Event(event tcell.Event) bool {
- return mv.term.Event(event)
+ if mv.term != nil {
+ return mv.term.Event(event)
+ }
+ return false
}
func (mv *MessageViewer) Focus(focus bool) {
- mv.term.Focus(focus)
+ if mv.term != nil {
+ mv.term.Focus(focus)
+ }
}
type HeaderView struct {