diff options
Diffstat (limited to 'widgets')
-rw-r--r-- | widgets/compose.go | 66 |
1 files changed, 65 insertions, 1 deletions
diff --git a/widgets/compose.go b/widgets/compose.go index 30c5268d..37e09ccb 100644 --- a/widgets/compose.go +++ b/widgets/compose.go @@ -464,6 +464,11 @@ func (c *Composer) AppendPart(mimetype string, params map[string]string, body io if !strings.HasPrefix(mimetype, "text") { return fmt.Errorf("can only append text mimetypes") } + for _, part := range c.textParts { + if part.MimeType == mimetype { + return fmt.Errorf("%s part already exists", mimetype) + } + } newPart, err := lib.NewPart(mimetype, params, body) if err != nil { return err @@ -473,6 +478,21 @@ func (c *Composer) AppendPart(mimetype string, params map[string]string, body io return nil } +func (c *Composer) RemovePart(mimetype string) error { + if mimetype == "text/plain" { + return fmt.Errorf("cannot remove text/plain parts") + } + for i, part := range c.textParts { + if part.MimeType != mimetype { + continue + } + c.textParts = append(c.textParts[:i], c.textParts[i+1:]...) + c.resetReview() + return nil + } + return fmt.Errorf("%s part not found", mimetype) +} + func (c *Composer) AddTemplate(template string, data interface{}) error { if template == "" { return nil @@ -1361,7 +1381,15 @@ func newReviewMessage(composer *Composer, err error) *reviewMessage { grid.AddChild(ui.NewText("text/plain", uiConfig.GetStyle(config.STYLE_DEFAULT))).At(i, 0) i += 1 for _, p := range composer.textParts { - grid.AddChild(ui.NewText(p.MimeType, uiConfig.GetStyle(config.STYLE_DEFAULT))).At(i, 0) + err := composer.updateMultipart(p) + if err != nil { + msg := fmt.Sprintf("%s error: %s", p.MimeType, err) + grid.AddChild(ui.NewText(msg, + uiConfig.GetStyle(config.STYLE_ERROR))).At(i, 0) + } else { + grid.AddChild(ui.NewText(p.MimeType, + uiConfig.GetStyle(config.STYLE_DEFAULT))).At(i, 0) + } i += 1 } @@ -1374,6 +1402,42 @@ func newReviewMessage(composer *Composer, err error) *reviewMessage { } } +func (c *Composer) updateMultipart(p *lib.Part) error { + command, found := c.aerc.Config().Converters[p.MimeType] + if !found { + // unreachable + return fmt.Errorf("no command defined for mime/type") + } + // reset part body to avoid it leaving outdated if the command fails + p.Data = nil + err := c.reloadEmail() + if err != nil { + return errors.Wrap(err, "reloadEmail") + } + body, err := io.ReadAll(c.email) + if err != nil { + return errors.Wrap(err, "io.ReadAll") + } + cmd := exec.Command("sh", "-c", command) + cmd.Stdin = bytes.NewReader(body) + out, err := cmd.Output() + if err != nil { + var stderr string + var ee *exec.ExitError + if errors.As(err, &ee) { + // append the first 30 chars of stderr if any + stderr = strings.Trim(string(ee.Stderr), " \t\n\r") + stderr = strings.ReplaceAll(stderr, "\n", "; ") + if stderr != "" { + stderr = fmt.Sprintf(": %.30s", stderr) + } + } + return fmt.Errorf("%s: %w%s", command, err, stderr) + } + p.Data = out + return nil +} + func (rm *reviewMessage) Invalidate() { ui.Invalidate() } |