From e0292fe9571dfde9e0b1a2ba965a6d08718b62e3 Mon Sep 17 00:00:00 2001 From: Michal Horejsek Date: Mon, 12 Oct 2020 10:13:58 +0200 Subject: [PATCH] Use map instead of list as set --- internal/transfer/provider_mbox.go | 10 ++--- .../transfer/provider_mbox_gmail_labels.go | 20 +++++----- .../provider_mbox_gmail_labels_test.go | 38 +++++++++++-------- internal/transfer/provider_mbox_source.go | 2 +- internal/transfer/provider_mbox_test.go | 2 +- internal/transfer/utils.go | 8 ---- 6 files changed, 41 insertions(+), 39 deletions(-) diff --git a/internal/transfer/provider_mbox.go b/internal/transfer/provider_mbox.go index 4c01a00a..1d1b9727 100644 --- a/internal/transfer/provider_mbox.go +++ b/internal/transfer/provider_mbox.go @@ -49,24 +49,24 @@ func (p *MBOXProvider) Mailboxes(includeEmpty, includeAllMail bool) ([]Mailbox, return nil, err } - mailboxNames := []string{} + mailboxNames := map[string]bool{} for _, filePath := range filePaths { fileName := filepath.Base(filePath) mailboxName := strings.TrimSuffix(fileName, ".mbox") - mailboxNames = appendIfNew(mailboxNames, mailboxName) + mailboxNames[mailboxName] = true labels, err := getGmailLabelsFromMboxFile(filepath.Join(p.root, filePath)) if err != nil { log.WithError(err).Error("Failed to get gmail labels from mbox file") continue } - for _, label := range labels { - mailboxNames = appendIfNew(mailboxNames, label) + for label := range labels { + mailboxNames[label] = true } } mailboxes := []Mailbox{} - for _, mailboxName := range mailboxNames { + for mailboxName := range mailboxNames { mailboxes = append(mailboxes, Mailbox{ ID: "", Name: mailboxName, diff --git a/internal/transfer/provider_mbox_gmail_labels.go b/internal/transfer/provider_mbox_gmail_labels.go index 19ebd365..3fec8cb7 100644 --- a/internal/transfer/provider_mbox_gmail_labels.go +++ b/internal/transfer/provider_mbox_gmail_labels.go @@ -25,9 +25,11 @@ import ( "strings" ) +type stringSet map[string]bool + const xGmailLabelsHeader = "X-Gmail-Labels" -func getGmailLabelsFromMboxFile(filePath string) ([]string, error) { +func getGmailLabelsFromMboxFile(filePath string) (stringSet, error) { f, err := os.Open(filePath) //nolint[gosec] if err != nil { return nil, err @@ -35,8 +37,8 @@ func getGmailLabelsFromMboxFile(filePath string) ([]string, error) { return getGmailLabelsFromMboxReader(f) } -func getGmailLabelsFromMboxReader(f io.Reader) ([]string, error) { - allLabels := []string{} +func getGmailLabelsFromMboxReader(f io.Reader) (stringSet, error) { + allLabels := map[string]bool{} r := bufio.NewReader(f) for { @@ -57,8 +59,8 @@ func getGmailLabelsFromMboxReader(f io.Reader) ([]string, error) { continue } if bytes.HasPrefix(b, []byte(xGmailLabelsHeader)) { - for _, label := range getGmailLabelsFromValue(string(b)) { - allLabels = appendIfNew(allLabels, label) + for label := range getGmailLabelsFromValue(string(b)) { + allLabels[label] = true } } } @@ -66,7 +68,7 @@ func getGmailLabelsFromMboxReader(f io.Reader) ([]string, error) { return allLabels, nil } -func getGmailLabelsFromMessage(body []byte) ([]string, error) { +func getGmailLabelsFromMessage(body []byte) (stringSet, error) { header, err := getMessageHeader(body) if err != nil { return nil, err @@ -75,15 +77,15 @@ func getGmailLabelsFromMessage(body []byte) ([]string, error) { return getGmailLabelsFromValue(labels), nil } -func getGmailLabelsFromValue(value string) []string { +func getGmailLabelsFromValue(value string) stringSet { value = strings.TrimPrefix(value, xGmailLabelsHeader+":") - labels := []string{} + labels := map[string]bool{} for _, label := range strings.Split(value, ",") { label = strings.TrimSpace(label) if label == "" { continue } - labels = appendIfNew(labels, label) + labels[label] = true } return labels } diff --git a/internal/transfer/provider_mbox_gmail_labels_test.go b/internal/transfer/provider_mbox_gmail_labels_test.go index 225ce20c..7e8be6dc 100644 --- a/internal/transfer/provider_mbox_gmail_labels_test.go +++ b/internal/transfer/provider_mbox_gmail_labels_test.go @@ -59,38 +59,38 @@ hello mboxReader := strings.NewReader(mboxFile) labels, err := getGmailLabelsFromMboxReader(mboxReader) 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) { tests := []struct { body string - wantLabels []string + wantLabels stringSet }{ {`Subject: One X-Gmail-Labels: Foo,Bar Hello -`, []string{"Foo", "Bar"}}, +`, toSet("Foo", "Bar")}, {`Subject: Two X-Gmail-Labels: Foo , Bar , Hello -`, []string{"Foo", "Bar"}}, +`, toSet("Foo", "Bar")}, {`Subject: Three X-Gmail-Labels: , Hello -`, []string{}}, +`, toSet()}, {`Subject: Four X-Gmail-Labels: Hello -`, []string{}}, +`, toSet()}, {`Subject: Five Hello -`, []string{}}, +`, toSet()}, } for _, tc := range tests { tc := tc @@ -105,15 +105,15 @@ Hello func TestGetGmailLabelsFromValue(t *testing.T) { tests := []struct { value string - wantLabels []string + wantLabels stringSet }{ - {"Foo,Bar", []string{"Foo", "Bar"}}, - {" Foo , Bar ", []string{"Foo", "Bar"}}, - {" Foo , Bar , ", []string{"Foo", "Bar"}}, - {" Foo Bar ", []string{"Foo Bar"}}, - {" , ", []string{}}, - {" ", []string{}}, - {"", []string{}}, + {"Foo,Bar", toSet("Foo", "Bar")}, + {" Foo , Bar ", toSet("Foo", "Bar")}, + {" Foo , Bar , ", toSet("Foo", "Bar")}, + {" Foo Bar ", toSet("Foo Bar")}, + {" , ", toSet()}, + {" ", toSet()}, + {"", toSet()}, } for _, tc := range tests { 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 +} diff --git a/internal/transfer/provider_mbox_source.go b/internal/transfer/provider_mbox_source.go index eaeb799c..a9d78d4d 100644 --- a/internal/transfer/provider_mbox_source.go +++ b/internal/transfer/provider_mbox_source.go @@ -179,7 +179,7 @@ func (p *MBOXProvider) getMessageRules(rules transferRules, folderName, id strin if err != nil { log.WithError(err).Error("Failed to get gmail labels, ") } else { - for _, label := range gmailLabels { + for label := range gmailLabels { rule, err := rules.getRuleBySourceMailboxName(label) if err != nil { log.WithField("msg", id).WithField("source", label).Debug("Message skipped due to source") diff --git a/internal/transfer/provider_mbox_test.go b/internal/transfer/provider_mbox_test.go index 815a4095..56aa196d 100644 --- a/internal/transfer/provider_mbox_test.go +++ b/internal/transfer/provider_mbox_test.go @@ -58,7 +58,7 @@ func TestMBOXProviderMailboxes(t *testing.T) { t.Run(fmt.Sprintf("%v", tc.includeEmpty), func(t *testing.T) { mailboxes, err := tc.provider.Mailboxes(tc.includeEmpty, false) r.NoError(t, err) - r.Equal(t, tc.wantMailboxes, mailboxes) + r.ElementsMatch(t, tc.wantMailboxes, mailboxes) }) } } diff --git a/internal/transfer/utils.go b/internal/transfer/utils.go index 157a399c..b7e4252d 100644 --- a/internal/transfer/utils.go +++ b/internal/transfer/utils.go @@ -160,13 +160,5 @@ func sanitizeFileName(fileName string) string { } return r }, fileName) - -func appendIfNew(list []string, newItem string) []string { - for _, item := range list { - if item == newItem { - return list - } - } - return append(list, newItem) }