39 lines
1 KiB
Go
39 lines
1 KiB
Go
|
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
|
||
|
}
|