aboutsummaryrefslogtreecommitdiffstats
path: root/lib/state
diff options
context:
space:
mode:
Diffstat (limited to 'lib/state')
-rw-r--r--lib/state/templates.go120
1 files changed, 72 insertions, 48 deletions
diff --git a/lib/state/templates.go b/lib/state/templates.go
index e93d0bb0..b0daa2cc 100644
--- a/lib/state/templates.go
+++ b/lib/state/templates.go
@@ -12,7 +12,19 @@ import (
"github.com/emersion/go-message/mail"
)
-type TemplateData struct {
+type DataSetter interface {
+ Data() models.TemplateData
+ SetHeaders(*mail.Header, *models.OriginalMail)
+ SetInfo(*models.MessageInfo, int, bool)
+ SetThreading(string, bool)
+ SetAccount(*config.AccountConfig)
+ SetFolder(*models.Directory)
+ SetRUE([]string, func(string) (int, int, int))
+ SetState(s *AccountState)
+ SetPendingKeys([]config.KeyStroke)
+}
+
+type templateData struct {
// only available when composing/replying/forwarding
headers *mail.Header
// only available when replying with a quote
@@ -37,25 +49,35 @@ type TemplateData struct {
pendingKeys []config.KeyStroke
}
+func NewDataSetter() DataSetter {
+ return &templateData{}
+}
+
+// Data returns the template data
+func (d *templateData) Data() models.TemplateData {
+ return d
+}
+
// only used for compose/reply/forward
-func (d *TemplateData) SetHeaders(h *mail.Header, o *models.OriginalMail) {
+func (d *templateData) SetHeaders(h *mail.Header, o *models.OriginalMail) {
d.headers = h
d.parent = o
}
// only used for message list templates
-func (d *TemplateData) SetInfo(info *models.MessageInfo, num int, marked bool) {
+func (d *templateData) SetInfo(info *models.MessageInfo, num int, marked bool,
+) {
d.info = info
d.msgNum = num
d.marked = marked
}
-func (d *TemplateData) SetThreading(prefix string, same bool) {
+func (d *templateData) SetThreading(prefix string, same bool) {
d.threadPrefix = prefix
d.threadSameSubject = same
}
-func (d *TemplateData) SetAccount(acct *config.AccountConfig) {
+func (d *templateData) SetAccount(acct *config.AccountConfig) {
d.account = acct
d.myAddresses = make(map[string]bool)
if acct != nil {
@@ -66,49 +88,51 @@ func (d *TemplateData) SetAccount(acct *config.AccountConfig) {
}
}
-func (d *TemplateData) SetFolder(folder *models.Directory) {
+func (d *templateData) SetFolder(folder *models.Directory) {
d.folder = folder
}
-func (d *TemplateData) SetRUE(folders []string, cb func(string) (int, int, int)) {
+func (d *templateData) SetRUE(folders []string,
+ cb func(string) (int, int, int),
+) {
d.folders = folders
d.getRUEcount = cb
}
-func (d *TemplateData) SetState(state *AccountState) {
+func (d *templateData) SetState(state *AccountState) {
d.state = state
}
-func (d *TemplateData) SetPendingKeys(keys []config.KeyStroke) {
+func (d *templateData) SetPendingKeys(keys []config.KeyStroke) {
d.pendingKeys = keys
}
-func (d *TemplateData) Account() string {
+func (d *templateData) Account() string {
if d.account != nil {
return d.account.Name
}
return ""
}
-func (d *TemplateData) Folder() string {
+func (d *templateData) Folder() string {
if d.folder != nil {
return d.folder.Name
}
return ""
}
-func (d *TemplateData) Role() string {
+func (d *templateData) Role() string {
if d.folder != nil {
return string(d.folder.Role)
}
return ""
}
-func (d *TemplateData) ui() *config.UIConfig {
+func (d *templateData) ui() *config.UIConfig {
return config.Ui.ForAccount(d.Account()).ForFolder(d.Folder())
}
-func (d *TemplateData) To() []*mail.Address {
+func (d *templateData) To() []*mail.Address {
var to []*mail.Address
switch {
case d.info != nil && d.info.Envelope != nil:
@@ -119,7 +143,7 @@ func (d *TemplateData) To() []*mail.Address {
return to
}
-func (d *TemplateData) Cc() []*mail.Address {
+func (d *templateData) Cc() []*mail.Address {
var cc []*mail.Address
switch {
case d.info != nil && d.info.Envelope != nil:
@@ -130,7 +154,7 @@ func (d *TemplateData) Cc() []*mail.Address {
return cc
}
-func (d *TemplateData) Bcc() []*mail.Address {
+func (d *templateData) Bcc() []*mail.Address {
var bcc []*mail.Address
switch {
case d.info != nil && d.info.Envelope != nil:
@@ -141,7 +165,7 @@ func (d *TemplateData) Bcc() []*mail.Address {
return bcc
}
-func (d *TemplateData) From() []*mail.Address {
+func (d *templateData) From() []*mail.Address {
var from []*mail.Address
switch {
case d.info != nil && d.info.Envelope != nil:
@@ -152,7 +176,7 @@ func (d *TemplateData) From() []*mail.Address {
return from
}
-func (d *TemplateData) Peer() []*mail.Address {
+func (d *templateData) Peer() []*mail.Address {
var from, to []*mail.Address
switch {
case d.info != nil && d.info.Envelope != nil:
@@ -170,7 +194,7 @@ func (d *TemplateData) Peer() []*mail.Address {
return from
}
-func (d *TemplateData) ReplyTo() []*mail.Address {
+func (d *templateData) ReplyTo() []*mail.Address {
var replyTo []*mail.Address
switch {
case d.info != nil && d.info.Envelope != nil:
@@ -181,7 +205,7 @@ func (d *TemplateData) ReplyTo() []*mail.Address {
return replyTo
}
-func (d *TemplateData) Date() time.Time {
+func (d *templateData) Date() time.Time {
var date time.Time
switch {
case d.info != nil && d.info.Envelope != nil:
@@ -194,7 +218,7 @@ func (d *TemplateData) Date() time.Time {
return date
}
-func (d *TemplateData) DateAutoFormat(date time.Time) string {
+func (d *templateData) DateAutoFormat(date time.Time) string {
if date.IsZero() {
return ""
}
@@ -218,7 +242,7 @@ func (d *TemplateData) DateAutoFormat(date time.Time) string {
return date.Format(fmt)
}
-func (d *TemplateData) Header(name string) string {
+func (d *templateData) Header(name string) string {
var h *mail.Header
switch {
case d.headers != nil:
@@ -235,11 +259,11 @@ func (d *TemplateData) Header(name string) string {
return text
}
-func (d *TemplateData) ThreadPrefix() string {
+func (d *templateData) ThreadPrefix() string {
return d.threadPrefix
}
-func (d *TemplateData) Subject() string {
+func (d *templateData) Subject() string {
var subject string
switch {
case d.info != nil && d.info.Envelope != nil:
@@ -253,7 +277,7 @@ func (d *TemplateData) Subject() string {
return subject
}
-func (d *TemplateData) SubjectBase() string {
+func (d *templateData) SubjectBase() string {
var subject string
switch {
case d.info != nil && d.info.Envelope != nil:
@@ -265,18 +289,18 @@ func (d *TemplateData) SubjectBase() string {
return base
}
-func (d *TemplateData) Number() int {
+func (d *templateData) Number() int {
return d.msgNum
}
-func (d *TemplateData) Labels() []string {
+func (d *templateData) Labels() []string {
if d.info == nil {
return nil
}
return d.info.Labels
}
-func (d *TemplateData) Flags() []string {
+func (d *templateData) Flags() []string {
var flags []string
if d.info == nil {
return flags
@@ -312,35 +336,35 @@ func (d *TemplateData) Flags() []string {
return flags
}
-func (d *TemplateData) MessageId() string {
+func (d *templateData) MessageId() string {
if d.info == nil || d.info.Envelope == nil {
return ""
}
return d.info.Envelope.MessageId
}
-func (d *TemplateData) Size() int {
+func (d *templateData) Size() int {
if d.info == nil || d.info.Envelope == nil {
return 0
}
return int(d.info.Size)
}
-func (d *TemplateData) OriginalText() string {
+func (d *templateData) OriginalText() string {
if d.parent == nil {
return ""
}
return d.parent.Text
}
-func (d *TemplateData) OriginalDate() time.Time {
+func (d *templateData) OriginalDate() time.Time {
if d.parent == nil {
return time.Time{}
}
return d.parent.Date
}
-func (d *TemplateData) OriginalFrom() []*mail.Address {
+func (d *templateData) OriginalFrom() []*mail.Address {
if d.parent == nil || d.parent.RFC822Headers == nil {
return nil
}
@@ -348,14 +372,14 @@ func (d *TemplateData) OriginalFrom() []*mail.Address {
return from
}
-func (d *TemplateData) OriginalMIMEType() string {
+func (d *templateData) OriginalMIMEType() string {
if d.parent == nil {
return ""
}
return d.parent.MIMEType
}
-func (d *TemplateData) OriginalHeader(name string) string {
+func (d *templateData) OriginalHeader(name string) string {
if d.parent == nil || d.parent.RFC822Headers == nil {
return ""
}
@@ -366,7 +390,7 @@ func (d *TemplateData) OriginalHeader(name string) string {
return text
}
-func (d *TemplateData) rue(folders ...string) (int, int, int) {
+func (d *templateData) rue(folders ...string) (int, int, int) {
var recent, unread, exists int
if d.getRUEcount != nil {
if len(folders) == 0 {
@@ -382,22 +406,22 @@ func (d *TemplateData) rue(folders ...string) (int, int, int) {
return recent, unread, exists
}
-func (d *TemplateData) Recent(folders ...string) int {
+func (d *templateData) Recent(folders ...string) int {
r, _, _ := d.rue(folders...)
return r
}
-func (d *TemplateData) Unread(folders ...string) int {
+func (d *templateData) Unread(folders ...string) int {
_, u, _ := d.rue(folders...)
return u
}
-func (d *TemplateData) Exists(folders ...string) int {
+func (d *templateData) Exists(folders ...string) int {
_, _, e := d.rue(folders...)
return e
}
-func (d *TemplateData) RUE(folders ...string) string {
+func (d *templateData) RUE(folders ...string) string {
r, u, e := d.rue(folders...)
switch {
case r > 0:
@@ -410,14 +434,14 @@ func (d *TemplateData) RUE(folders ...string) string {
return ""
}
-func (d *TemplateData) Connected() bool {
+func (d *templateData) Connected() bool {
if d.state != nil {
return d.state.Connected
}
return false
}
-func (d *TemplateData) ConnectionInfo() string {
+func (d *templateData) ConnectionInfo() string {
switch {
case d.state == nil:
return ""
@@ -430,7 +454,7 @@ func (d *TemplateData) ConnectionInfo() string {
}
}
-func (d *TemplateData) ContentInfo() string {
+func (d *templateData) ContentInfo() string {
if d.state == nil {
return ""
}
@@ -447,7 +471,7 @@ func (d *TemplateData) ContentInfo() string {
return strings.Join(content, config.Statusline.Separator)
}
-func (d *TemplateData) StatusInfo() string {
+func (d *templateData) StatusInfo() string {
stat := d.ConnectionInfo()
if content := d.ContentInfo(); content != "" {
stat += config.Statusline.Separator + content
@@ -455,7 +479,7 @@ func (d *TemplateData) StatusInfo() string {
return stat
}
-func (d *TemplateData) TrayInfo() string {
+func (d *templateData) TrayInfo() string {
if d.state == nil {
return ""
}
@@ -473,17 +497,17 @@ func (d *TemplateData) TrayInfo() string {
return strings.Join(tray, config.Statusline.Separator)
}
-func (d *TemplateData) PendingKeys() string {
+func (d *templateData) PendingKeys() string {
return config.FormatKeyStrokes(d.pendingKeys)
}
-func (d *TemplateData) Style(content, name string) string {
+func (d *templateData) Style(content, name string) string {
cfg := config.Ui.ForAccount(d.Account())
style := cfg.GetUserStyle(name)
return parse.ApplyStyle(style, content)
}
-func (d *TemplateData) StyleSwitch(content string, cases ...models.Case) string {
+func (d *templateData) StyleSwitch(content string, cases ...models.Case) string {
for _, c := range cases {
if c.Matches(content) {
cfg := config.Ui.ForAccount(d.Account())