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 }