package protocol import ( "encoding/base64" "encoding/json" "fmt" "strconv" "github.com/aws/aws-sdk-go/aws" ) // EscapeMode is the mode that should be use for escaping a value type EscapeMode uint // The modes for escaping a value before it is marshaled, and unmarshaled. const ( NoEscape EscapeMode = iota Base64Escape QuotedEscape ) // EncodeJSONValue marshals the value into a JSON string, and optionally base64 // encodes the string before returning it. // // Will panic if the escape mode is unknown. func EncodeJSONValue(v aws.JSONValue, escape EscapeMode) (string, error) { b, err := json.Marshal(v) if err != nil { return "", err } switch escape { case NoEscape: return string(b), nil case Base64Escape: return base64.StdEncoding.EncodeToString(b), nil case QuotedEscape: return strconv.Quote(string(b)), nil } panic(fmt.Sprintf("EncodeJSONValue called with unknown EscapeMode, %v", escape)) } // DecodeJSONValue will attempt to decode the string input as a JSONValue. // Optionally decoding base64 the value first before JSON unmarshaling. // // Will panic if the escape mode is unknown. func DecodeJSONValue(v string, escape EscapeMode) (aws.JSONValue, error) { var b []byte var err error switch escape { case NoEscape: b = []byte(v) case Base64Escape: b, err = base64.StdEncoding.DecodeString(v) case QuotedEscape: var u string u, err = strconv.Unquote(v) b = []byte(u) default: panic(fmt.Sprintf("DecodeJSONValue called with unknown EscapeMode, %v", escape)) } if err != nil { return nil, err } m := aws.JSONValue{} err = json.Unmarshal(b, &m) if err != nil { return nil, err } return m, nil }