This is the v1 version, had the v2 before.
This commit is contained in:
73
backend/backendutil/flags.go
Normal file
73
backend/backendutil/flags.go
Normal file
@@ -0,0 +1,73 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user