github.com/jordwest/imap-server@v0.0.0-20200627020849-1cf758ba359f/util/formatting.go (about) 1 package util 2 3 import ( 4 "bytes" 5 "fmt" 6 "io" 7 "net/textproto" 8 "strings" 9 "time" 10 ) 11 12 // RFC822 date format used by IMAP in go date format 13 const RFC822Date = "Mon, 2 Jan 2006 15:04:05 +0700" 14 15 // Date format used in INTERNALDATE fetch parameter 16 const InternalDate = "02-Jan-2006 15:04:05 +0700" 17 18 // FormatDate formats the given date in the RFC822 format. 19 func FormatDate(date time.Time) string { 20 return date.Format(RFC822Date) 21 } 22 23 // SplitParams splits parameters in IMAP arguments so that they're easily 24 // readable. 25 func SplitParams(params string) []string { 26 paramsOpen := false 27 result := strings.FieldsFunc(params, func(r rune) bool { 28 if r == '[' { 29 paramsOpen = true 30 } 31 if r == ']' { 32 paramsOpen = false 33 } 34 if r == ' ' && !paramsOpen { 35 return true 36 } 37 return false 38 }) 39 return result 40 } 41 42 // WriteMIMEHeader writes the MIME header out in the standard format. This 43 // should eventually be superseded by textproto.MIMEHeader.Write(w) once 44 // it is implemented in the go standard library. 45 func WriteMIMEHeader(writer io.Writer, header textproto.MIMEHeader) (n int, err error) { 46 for k, vv := range header { 47 for _, v := range vv { 48 bytes, err := fmt.Fprintf(writer, "%s: %s\r\n", k, v) 49 if err != nil { 50 return n, err 51 } 52 n += bytes 53 } 54 } 55 return n, nil 56 } 57 58 // MIMEHeaderToString converts a textproto.MIMEHeader into its string 59 // representation. 60 func MIMEHeaderToString(header textproto.MIMEHeader) string { 61 buf := &bytes.Buffer{} 62 _, err := WriteMIMEHeader(buf, header) 63 if err != nil { 64 panic(err) 65 } 66 return buf.String() 67 }