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
85
86
87
88
|
package config
import (
"regexp"
"strings"
"git.sr.ht/~rjarry/aerc/lib/log"
"github.com/go-ini/ini"
)
type FilterType int
const (
FILTER_MIMETYPE FilterType = iota
FILTER_HEADER
FILTER_HEADERS
FILTER_FILENAME
)
type FilterConfig struct {
Type FilterType
Filter string
Command string
Header string
Regex *regexp.Regexp
}
var Filters []*FilterConfig
func parseFilters(file *ini.File) error {
filters, err := file.GetSection("filters")
if err != nil {
goto end
}
for _, key := range filters.Keys() {
filter := FilterConfig{
Command: key.Value(),
Filter: key.Name(),
}
switch {
case strings.HasPrefix(filter.Filter, ".filename,~"):
filter.Type = FILTER_FILENAME
regex := filter.Filter[strings.Index(filter.Filter, "~")+1:]
filter.Regex, err = regexp.Compile(regex)
if err != nil {
return err
}
case strings.HasPrefix(filter.Filter, ".filename,"):
filter.Type = FILTER_FILENAME
value := filter.Filter[strings.Index(filter.Filter, ",")+1:]
filter.Regex, err = regexp.Compile(regexp.QuoteMeta(value))
if err != nil {
return err
}
case strings.Contains(filter.Filter, ",~"):
filter.Type = FILTER_HEADER
//nolint:gocritic // guarded by strings.Contains
header := filter.Filter[:strings.Index(filter.Filter, ",")]
regex := filter.Filter[strings.Index(filter.Filter, "~")+1:]
filter.Header = strings.ToLower(header)
filter.Regex, err = regexp.Compile(regex)
if err != nil {
return err
}
case strings.ContainsRune(filter.Filter, ','):
filter.Type = FILTER_HEADER
//nolint:gocritic // guarded by strings.Contains
header := filter.Filter[:strings.Index(filter.Filter, ",")]
value := filter.Filter[strings.Index(filter.Filter, ",")+1:]
filter.Header = strings.ToLower(header)
filter.Regex, err = regexp.Compile(regexp.QuoteMeta(value))
if err != nil {
return err
}
case filter.Filter == ".headers":
filter.Type = FILTER_HEADERS
default:
filter.Type = FILTER_MIMETYPE
}
Filters = append(Filters, &filter)
}
end:
log.Debugf("aerc.conf: [filters] %#v", Filters)
return nil
}
|