internal/imap/flag.go (view raw)
1package imap
2
3import (
4 "strings"
5
6 "github.com/emersion/go-imap/v2"
7)
8
9func isAllowedFlag(flag imap.Flag) bool {
10 if len(flag) == 0 { // RFC 9051 requires one or more characters
11 return false
12 }
13 // system flags start with "\" and are defined per RFC 9051
14 if strings.HasPrefix(string(flag), "\\") {
15 switch flag {
16 // \Recent was deprecated in IMAP 4 rev.2
17 case imap.FlagSeen, imap.FlagAnswered, imap.FlagFlagged, imap.FlagDeleted, imap.FlagDraft:
18 return true
19 default:
20 return false
21 }
22 }
23
24 // Clients are generally free in adding keywords
25 return true
26}
27
28func toIMAPFlags(flags []string) []imap.Flag {
29 out := make([]imap.Flag, 0, len(flags))
30 for _, flag := range flags {
31 if flag == "" {
32 continue
33 }
34 out = append(out, imap.Flag(flag))
35 }
36 if len(out) == 0 {
37 return nil
38 }
39 return out
40}
41
42func fromIMAPFlags(flags []imap.Flag) []string {
43 out := make([]string, 0, len(flags))
44 for _, f := range flags {
45 if string(f) == "" {
46 continue
47 }
48 out = append(out, string(f))
49 }
50 return out
51}