github.com/jcmturner/gokrb5/v8@v8.4.4/krberror/error.go (about) 1 // Package krberror provides error type and functions for gokrb5. 2 package krberror 3 4 import ( 5 "fmt" 6 "strings" 7 ) 8 9 // Error type descriptions. 10 const ( 11 separator = " < " 12 EncodingError = "Encoding_Error" 13 NetworkingError = "Networking_Error" 14 DecryptingError = "Decrypting_Error" 15 EncryptingError = "Encrypting_Error" 16 ChksumError = "Checksum_Error" 17 KRBMsgError = "KRBMessage_Handling_Error" 18 ConfigError = "Configuration_Error" 19 KDCError = "KDC_Error" 20 ) 21 22 // Krberror is an error type for gokrb5 23 type Krberror struct { 24 RootCause string 25 EText []string 26 } 27 28 // Error function to implement the error interface. 29 func (e Krberror) Error() string { 30 return fmt.Sprintf("[Root cause: %s] ", e.RootCause) + strings.Join(e.EText, separator) 31 } 32 33 // Add another error statement to the error. 34 func (e *Krberror) Add(et string, s string) { 35 e.EText = append([]string{fmt.Sprintf("%s: %s", et, s)}, e.EText...) 36 } 37 38 // New creates a new instance of Krberror. 39 func New(et, s string) Krberror { 40 return Krberror{ 41 RootCause: et, 42 EText: []string{s}, 43 } 44 } 45 46 // Errorf appends to or creates a new Krberror. 47 func Errorf(err error, et, format string, a ...interface{}) Krberror { 48 if e, ok := err.(Krberror); ok { 49 e.Add(et, fmt.Sprintf(format, a...)) 50 return e 51 } 52 return NewErrorf(et, format+": %s", append(a, err)...) 53 } 54 55 // NewErrorf creates a new Krberror from a formatted string. 56 func NewErrorf(et, format string, a ...interface{}) Krberror { 57 var s string 58 if len(a) > 0 { 59 s = fmt.Sprintf("%s: %s", et, fmt.Sprintf(format, a...)) 60 } else { 61 s = fmt.Sprintf("%s: %s", et, format) 62 } 63 return Krberror{ 64 RootCause: et, 65 EText: []string{s}, 66 } 67 }