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  }