File: flags.go

package info (click to toggle)
golang-github-emersion-go-imap 1.2.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 840 kB
  • sloc: makefile: 2
file content (73 lines) | stat: -rw-r--r-- 1,687 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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
}