diff options
author | Simon Ser <contact@emersion.fr> | 2020-02-12 14:42:51 +0100 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2020-02-12 15:41:00 +0100 |
commit | 8299617ebc24a4a5bd1dc03070e17713be7e1e1b (patch) | |
tree | 6f63bf506717b7348f625169885c68bd2c82a23e /plugins/base/viewer.go | |
parent | 892f1fa581d853f0bc5e83f8b2e66169921330a2 (diff) | |
download | alps-8299617ebc24a4a5bd1dc03070e17713be7e1e1b.tar.gz alps-8299617ebc24a4a5bd1dc03070e17713be7e1e1b.zip |
Turn message part viewers into plugins
Diffstat (limited to 'plugins/base/viewer.go')
-rw-r--r-- | plugins/base/viewer.go | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/plugins/base/viewer.go b/plugins/base/viewer.go new file mode 100644 index 0000000..a76ecf9 --- /dev/null +++ b/plugins/base/viewer.go @@ -0,0 +1,38 @@ +package koushinbase + +import ( + "fmt" + + "git.sr.ht/~emersion/koushin" + "github.com/emersion/go-message" +) + +// ErrViewUnsupported is returned by Viewer.ViewMessagePart when the message +// part isn't supported. +var ErrViewUnsupported = fmt.Errorf("cannot generate message view: unsupported part") + +// Viewer is a message part viewer. +type Viewer interface { + // ViewMessagePart renders a message part. The returned value is displayed + // in a template. ErrViewUnsupported is returned if the message part isn't + // supported. + ViewMessagePart(*koushin.Context, *IMAPMessage, *message.Entity) (interface{}, error) +} + +var viewers []Viewer + +// RegisterViewer registers a message part viewer. +func RegisterViewer(viewer Viewer) { + viewers = append(viewers, viewer) +} + +func viewMessagePart(ctx *koushin.Context, msg *IMAPMessage, part *message.Entity) (interface{}, error) { + for _, viewer := range viewers { + v, err := viewer.ViewMessagePart(ctx, msg, part) + if err == ErrViewUnsupported { + continue + } + return v, err + } + return nil, ErrViewUnsupported +} |