aboutsummaryrefslogblamecommitdiff
path: root/plugins/base/viewer.go
blob: a76ecf9e8548916edd860aafd730881e034d9e96 (plain) (tree)





































                                                                                                         
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
}