mirror of
https://github.com/ProtonMail/proton-bridge.git
synced 2025-12-18 16:17:03 +00:00
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
|
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,
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
}
|
||||||
|
|||||||
@ -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")
|
||||||
|
|||||||
@ -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)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user