forked from Silverfish/proton-bridge
Use map instead of list as set
This commit is contained in:
@ -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,
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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")
|
||||
|
||||
@ -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)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user