Use map instead of list as set

This commit is contained in:
Michal Horejsek
2020-10-12 10:13:58 +02:00
parent ef85c8df24
commit e0292fe957
6 changed files with 41 additions and 39 deletions

View File

@ -49,24 +49,24 @@ func (p *MBOXProvider) Mailboxes(includeEmpty, includeAllMail bool) ([]Mailbox,
return nil, err return nil, err
} }
mailboxNames := []string{} mailboxNames := map[string]bool{}
for _, filePath := range filePaths { for _, filePath := range filePaths {
fileName := filepath.Base(filePath) fileName := filepath.Base(filePath)
mailboxName := strings.TrimSuffix(fileName, ".mbox") mailboxName := strings.TrimSuffix(fileName, ".mbox")
mailboxNames = appendIfNew(mailboxNames, mailboxName) mailboxNames[mailboxName] = true
labels, err := getGmailLabelsFromMboxFile(filepath.Join(p.root, filePath)) labels, err := getGmailLabelsFromMboxFile(filepath.Join(p.root, filePath))
if err != nil { if err != nil {
log.WithError(err).Error("Failed to get gmail labels from mbox file") log.WithError(err).Error("Failed to get gmail labels from mbox file")
continue continue
} }
for _, label := range labels { for label := range labels {
mailboxNames = appendIfNew(mailboxNames, label) mailboxNames[label] = true
} }
} }
mailboxes := []Mailbox{} mailboxes := []Mailbox{}
for _, mailboxName := range mailboxNames { for mailboxName := range mailboxNames {
mailboxes = append(mailboxes, Mailbox{ mailboxes = append(mailboxes, Mailbox{
ID: "", ID: "",
Name: mailboxName, Name: mailboxName,

View File

@ -25,9 +25,11 @@ import (
"strings" "strings"
) )
type stringSet map[string]bool
const xGmailLabelsHeader = "X-Gmail-Labels" const xGmailLabelsHeader = "X-Gmail-Labels"
func getGmailLabelsFromMboxFile(filePath string) ([]string, error) { func getGmailLabelsFromMboxFile(filePath string) (stringSet, error) {
f, err := os.Open(filePath) //nolint[gosec] f, err := os.Open(filePath) //nolint[gosec]
if err != nil { if err != nil {
return nil, err return nil, err
@ -35,8 +37,8 @@ func getGmailLabelsFromMboxFile(filePath string) ([]string, error) {
return getGmailLabelsFromMboxReader(f) return getGmailLabelsFromMboxReader(f)
} }
func getGmailLabelsFromMboxReader(f io.Reader) ([]string, error) { func getGmailLabelsFromMboxReader(f io.Reader) (stringSet, error) {
allLabels := []string{} allLabels := map[string]bool{}
r := bufio.NewReader(f) r := bufio.NewReader(f)
for { for {
@ -57,8 +59,8 @@ func getGmailLabelsFromMboxReader(f io.Reader) ([]string, error) {
continue continue
} }
if bytes.HasPrefix(b, []byte(xGmailLabelsHeader)) { if bytes.HasPrefix(b, []byte(xGmailLabelsHeader)) {
for _, label := range getGmailLabelsFromValue(string(b)) { for label := range getGmailLabelsFromValue(string(b)) {
allLabels = appendIfNew(allLabels, label) allLabels[label] = true
} }
} }
} }
@ -66,7 +68,7 @@ func getGmailLabelsFromMboxReader(f io.Reader) ([]string, error) {
return allLabels, nil return allLabels, nil
} }
func getGmailLabelsFromMessage(body []byte) ([]string, error) { func getGmailLabelsFromMessage(body []byte) (stringSet, error) {
header, err := getMessageHeader(body) header, err := getMessageHeader(body)
if err != nil { if err != nil {
return nil, err return nil, err
@ -75,15 +77,15 @@ func getGmailLabelsFromMessage(body []byte) ([]string, error) {
return getGmailLabelsFromValue(labels), nil return getGmailLabelsFromValue(labels), nil
} }
func getGmailLabelsFromValue(value string) []string { func getGmailLabelsFromValue(value string) stringSet {
value = strings.TrimPrefix(value, xGmailLabelsHeader+":") value = strings.TrimPrefix(value, xGmailLabelsHeader+":")
labels := []string{} labels := map[string]bool{}
for _, label := range strings.Split(value, ",") { for _, label := range strings.Split(value, ",") {
label = strings.TrimSpace(label) label = strings.TrimSpace(label)
if label == "" { if label == "" {
continue continue
} }
labels = appendIfNew(labels, label) labels[label] = true
} }
return labels return labels
} }

View File

@ -59,38 +59,38 @@ hello
mboxReader := strings.NewReader(mboxFile) mboxReader := strings.NewReader(mboxFile)
labels, err := getGmailLabelsFromMboxReader(mboxReader) labels, err := getGmailLabelsFromMboxReader(mboxReader)
r.NoError(t, err) r.NoError(t, err)
r.Equal(t, []string{"Foo", "Bar", "Baz"}, labels) r.Equal(t, toSet("Foo", "Bar", "Baz"), labels)
} }
func TestGetGmailLabelsFromMessage(t *testing.T) { func TestGetGmailLabelsFromMessage(t *testing.T) {
tests := []struct { tests := []struct {
body string body string
wantLabels []string wantLabels stringSet
}{ }{
{`Subject: One {`Subject: One
X-Gmail-Labels: Foo,Bar X-Gmail-Labels: Foo,Bar
Hello Hello
`, []string{"Foo", "Bar"}}, `, toSet("Foo", "Bar")},
{`Subject: Two {`Subject: Two
X-Gmail-Labels: Foo , Bar , X-Gmail-Labels: Foo , Bar ,
Hello Hello
`, []string{"Foo", "Bar"}}, `, toSet("Foo", "Bar")},
{`Subject: Three {`Subject: Three
X-Gmail-Labels: , X-Gmail-Labels: ,
Hello Hello
`, []string{}}, `, toSet()},
{`Subject: Four {`Subject: Four
X-Gmail-Labels: X-Gmail-Labels:
Hello Hello
`, []string{}}, `, toSet()},
{`Subject: Five {`Subject: Five
Hello Hello
`, []string{}}, `, toSet()},
} }
for _, tc := range tests { for _, tc := range tests {
tc := tc tc := tc
@ -105,15 +105,15 @@ Hello
func TestGetGmailLabelsFromValue(t *testing.T) { func TestGetGmailLabelsFromValue(t *testing.T) {
tests := []struct { tests := []struct {
value string value string
wantLabels []string wantLabels stringSet
}{ }{
{"Foo,Bar", []string{"Foo", "Bar"}}, {"Foo,Bar", toSet("Foo", "Bar")},
{" Foo , Bar ", []string{"Foo", "Bar"}}, {" Foo , Bar ", toSet("Foo", "Bar")},
{" Foo , Bar , ", []string{"Foo", "Bar"}}, {" Foo , Bar , ", toSet("Foo", "Bar")},
{" Foo Bar ", []string{"Foo Bar"}}, {" Foo Bar ", toSet("Foo Bar")},
{" , ", []string{}}, {" , ", toSet()},
{" ", []string{}}, {" ", toSet()},
{"", []string{}}, {"", toSet()},
} }
for _, tc := range tests { for _, tc := range tests {
tc := tc tc := tc
@ -123,3 +123,11 @@ func TestGetGmailLabelsFromValue(t *testing.T) {
}) })
} }
} }
func toSet(items ...string) stringSet {
set := map[string]bool{}
for _, item := range items {
set[item] = true
}
return set
}

View File

@ -179,7 +179,7 @@ func (p *MBOXProvider) getMessageRules(rules transferRules, folderName, id strin
if err != nil { if err != nil {
log.WithError(err).Error("Failed to get gmail labels, ") log.WithError(err).Error("Failed to get gmail labels, ")
} else { } else {
for _, label := range gmailLabels { for label := range gmailLabels {
rule, err := rules.getRuleBySourceMailboxName(label) rule, err := rules.getRuleBySourceMailboxName(label)
if err != nil { if err != nil {
log.WithField("msg", id).WithField("source", label).Debug("Message skipped due to source") log.WithField("msg", id).WithField("source", label).Debug("Message skipped due to source")

View File

@ -58,7 +58,7 @@ func TestMBOXProviderMailboxes(t *testing.T) {
t.Run(fmt.Sprintf("%v", tc.includeEmpty), func(t *testing.T) { t.Run(fmt.Sprintf("%v", tc.includeEmpty), func(t *testing.T) {
mailboxes, err := tc.provider.Mailboxes(tc.includeEmpty, false) mailboxes, err := tc.provider.Mailboxes(tc.includeEmpty, false)
r.NoError(t, err) r.NoError(t, err)
r.Equal(t, tc.wantMailboxes, mailboxes) r.ElementsMatch(t, tc.wantMailboxes, mailboxes)
}) })
} }
} }

View File

@ -160,13 +160,5 @@ func sanitizeFileName(fileName string) string {
} }
return r return r
}, fileName) }, fileName)
func appendIfNew(list []string, newItem string) []string {
for _, item := range list {
if item == newItem {
return list
}
}
return append(list, newItem)
} }