74 lines
1.6 KiB
Go
74 lines
1.6 KiB
Go
package backendutil
|
|
|
|
import (
|
|
"github.com/emersion/go-imap"
|
|
)
|
|
|
|
// UpdateFlags executes a flag operation on the flag set current.
|
|
func UpdateFlags(current []string, op imap.FlagsOp, flags []string) []string {
|
|
// Don't modify contents of 'flags' slice. Only modify 'current'.
|
|
// See https://github.com/golang/go/wiki/SliceTricks
|
|
|
|
// Re-use current's backing store
|
|
newFlags := current[:0]
|
|
switch op {
|
|
case imap.SetFlags:
|
|
hasRecent := false
|
|
// keep recent flag
|
|
for _, flag := range current {
|
|
if flag == imap.RecentFlag {
|
|
newFlags = append(newFlags, imap.RecentFlag)
|
|
hasRecent = true
|
|
break
|
|
}
|
|
}
|
|
// append new flags
|
|
for _, flag := range flags {
|
|
if flag == imap.RecentFlag {
|
|
// Make sure we don't add the recent flag multiple times.
|
|
if hasRecent {
|
|
// Already have the recent flag, skip.
|
|
continue
|
|
}
|
|
hasRecent = true
|
|
}
|
|
// append new flag
|
|
newFlags = append(newFlags, flag)
|
|
}
|
|
case imap.AddFlags:
|
|
// keep current flags
|
|
newFlags = current
|
|
// Only add new flag if it isn't already in current list.
|
|
for _, addFlag := range flags {
|
|
found := false
|
|
for _, flag := range current {
|
|
if addFlag == flag {
|
|
found = true
|
|
break
|
|
}
|
|
}
|
|
// new flag not found, add it.
|
|
if !found {
|
|
newFlags = append(newFlags, addFlag)
|
|
}
|
|
}
|
|
case imap.RemoveFlags:
|
|
// Filter current flags
|
|
for _, flag := range current {
|
|
remove := false
|
|
for _, removeFlag := range flags {
|
|
if removeFlag == flag {
|
|
remove = true
|
|
}
|
|
}
|
|
if !remove {
|
|
newFlags = append(newFlags, flag)
|
|
}
|
|
}
|
|
default:
|
|
// Unknown operation, return current flags unchanged
|
|
newFlags = current
|
|
}
|
|
return newFlags
|
|
}
|