You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
2.2 KiB
86 lines
2.2 KiB
package restjson
|
|
|
|
import (
|
|
"encoding/json"
|
|
"io"
|
|
"strings"
|
|
|
|
"github.com/aws/smithy-go"
|
|
)
|
|
|
|
// GetErrorInfo util looks for code, __type, and message members in the
|
|
// json body. These members are optionally available, and the function
|
|
// returns the value of member if it is available. This function is useful to
|
|
// identify the error code, msg in a REST JSON error response.
|
|
func GetErrorInfo(decoder *json.Decoder) (errorType string, message string, err error) {
|
|
var errInfo struct {
|
|
Code string
|
|
Type string `json:"__type"`
|
|
Message string
|
|
}
|
|
|
|
err = decoder.Decode(&errInfo)
|
|
if err != nil {
|
|
if err == io.EOF {
|
|
return errorType, message, nil
|
|
}
|
|
return errorType, message, err
|
|
}
|
|
|
|
// assign error type
|
|
if len(errInfo.Code) != 0 {
|
|
errorType = errInfo.Code
|
|
} else if len(errInfo.Type) != 0 {
|
|
errorType = errInfo.Type
|
|
}
|
|
|
|
// assign error message
|
|
if len(errInfo.Message) != 0 {
|
|
message = errInfo.Message
|
|
}
|
|
|
|
// sanitize error
|
|
if len(errorType) != 0 {
|
|
errorType = SanitizeErrorCode(errorType)
|
|
}
|
|
|
|
return errorType, message, nil
|
|
}
|
|
|
|
// SanitizeErrorCode sanitizes the errorCode string .
|
|
// The rule for sanitizing is if a `:` character is present, then take only the
|
|
// contents before the first : character in the value.
|
|
// If a # character is present, then take only the contents after the
|
|
// first # character in the value.
|
|
func SanitizeErrorCode(errorCode string) string {
|
|
if strings.ContainsAny(errorCode, ":") {
|
|
errorCode = strings.SplitN(errorCode, ":", 2)[0]
|
|
}
|
|
|
|
if strings.ContainsAny(errorCode, "#") {
|
|
errorCode = strings.SplitN(errorCode, "#", 2)[1]
|
|
}
|
|
|
|
return errorCode
|
|
}
|
|
|
|
// GetSmithyGenericAPIError returns smithy generic api error and an error interface.
|
|
// Takes in json decoder, and error Code string as args. The function retrieves error message
|
|
// and error code from the decoder body. If errorCode of length greater than 0 is passed in as
|
|
// an argument, it is used instead.
|
|
func GetSmithyGenericAPIError(decoder *json.Decoder, errorCode string) (*smithy.GenericAPIError, error) {
|
|
errorType, message, err := GetErrorInfo(decoder)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if len(errorCode) == 0 {
|
|
errorCode = errorType
|
|
}
|
|
|
|
return &smithy.GenericAPIError{
|
|
Code: errorCode,
|
|
Message: message,
|
|
}, nil
|
|
}
|