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
}
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,

View File

@ -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
}

View File

@ -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
}

View File

@ -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")

View File

@ -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)
})
}
}

View File

@ -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)
}