aboutsummaryrefslogtreecommitdiff
path: root/commands/compose/header.go
blob: 59d01952bc875b88266eff5dd18e953c0fd2aea5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package compose

import (
	"fmt"
	"strings"

	"git.sr.ht/~rjarry/aerc/commands"
	"git.sr.ht/~rjarry/aerc/widgets"
	"git.sr.ht/~sircmpwn/getopt"
)

type Header struct{}

var headers = []string{
	"From",
	"To",
	"Cc",
	"Bcc",
	"Subject",
	"Comments",
	"Keywords",
}

func init() {
	register(Header{})
}

func (Header) Aliases() []string {
	return []string{"header"}
}

func (Header) Options() string {
	return "fd"
}

func (Header) Complete(aerc *widgets.Aerc, args []string) []string {
	return commands.CompletionFromList(aerc, headers, args)
}

func (h Header) Execute(aerc *widgets.Aerc, args []string) error {
	opts, optind, err := getopt.Getopts(args, h.Options())
	args = args[optind:]
	if err == nil && len(args) < 1 {
		err = fmt.Errorf("not enough arguments")
	}
	if err != nil {
		return fmt.Errorf("%w. usage: header [-fd] <name> [<value>]", err)
	}

	var force bool = false
	var remove bool = false
	for _, opt := range opts {
		switch opt.Option {
		case 'f':
			force = true
		case 'd':
			remove = true
		}
	}

	composer, _ := aerc.SelectedTabContent().(*widgets.Composer)

	name := strings.TrimRight(args[0], ":")

	if remove {
		return composer.DelEditor(name)
	}

	value := strings.Join(args[1:], " ")

	if !force {
		headers, err := composer.PrepareHeader()
		if err != nil {
			return err
		}
		if headers.Get(name) != "" && value != "" {
			return fmt.Errorf(
				"Header %s is already set to %q (use -f to overwrite)",
				name, headers.Get(name))
		}
	}

	return composer.AddEditor(name, value, false)
}