about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorRobert Günzler <r@gnzler.io>2019-11-25 13:39:25 +0100
committerDrew DeVault <sir@cmpwn.com>2019-12-04 09:37:52 -0500
commit31e3e9f56e0b8123f0238537112496b407055aef (patch)
tree65bb3d183365fff538dab5a66462ce6f6454111d
parentc1d57977af3eae723406b3aaff82e7bf16b12d0c (diff)
downloadaerc-31e3e9f56e0b8123f0238537112496b407055aef.tar.gz
Parse headers from template
Parse the processed template for headers and populates matching header
editors accordingly.
Those are then stripped from the template body before prepending it
and remaining header fields to the composer content.

The motivation for this is keeping receiver, sender and subject
lines in the template file and generating the message subject with the
date functions.
-rw-r--r--widgets/compose.go42
1 files changed, 39 insertions, 3 deletions
diff --git a/widgets/compose.go b/widgets/compose.go
index 62aaafe..6e527cb 100644
--- a/widgets/compose.go
+++ b/widgets/compose.go
@@ -179,8 +179,7 @@ func (c *Composer) AddTemplate(template string, data interface{}) error {
 	if err != nil {
 		return err
 	}
-	c.PrependContents(bytes.NewReader(templateText))
-	return nil
+	return c.addTemplate(bytes.NewReader(templateText))
 }
 
 func (c *Composer) AddTemplateFromString(template string, data interface{}) error {
@@ -192,7 +191,44 @@ func (c *Composer) AddTemplateFromString(template string, data interface{}) erro
 	if err != nil {
 		return err
 	}
-	c.PrependContents(bytes.NewReader(templateText))
+	return c.addTemplate(bytes.NewReader(templateText))
+}
+
+func (c *Composer) addTemplate(tmpl io.Reader) error {
+	reader, err := mail.CreateReader(tmpl)
+	if err != nil {
+		return errors.Wrap(err, "mail.CreateReader")
+	}
+	defer reader.Close()
+
+	// populate header editors
+	header := reader.Header
+	mhdr := (*message.Header)(&header.Header)
+	for _, editor := range c.editors {
+		if mhdr.Has(editor.name) {
+			editor.input.Set(mhdr.Get(editor.name))
+			mhdr.Del(editor.name)
+		}
+	}
+
+	part, err := reader.NextPart()
+	if err != nil {
+		return errors.Wrap(err, "reader.NextPart")
+	}
+	c.PrependContents(part.Body)
+
+	var (
+		headers string
+		fds     = mhdr.Fields()
+	)
+	for fds.Next() {
+		headers += fmt.Sprintf("%s: %s\n", fds.Key(), fds.Value())
+	}
+	if headers != "" {
+		headers += "\n"
+	}
+
+	c.PrependContents(bytes.NewReader([]byte(headers)))
 	return nil
 }