github.com/aavshr/aws-sdk-go@v1.41.3/private/protocol/jsonvalue.go (about) 1 package protocol 2 3 import ( 4 "encoding/base64" 5 "encoding/json" 6 "fmt" 7 "strconv" 8 9 "github.com/aavshr/aws-sdk-go/aws" 10 ) 11 12 // EscapeMode is the mode that should be use for escaping a value 13 type EscapeMode uint 14 15 // The modes for escaping a value before it is marshaled, and unmarshaled. 16 const ( 17 NoEscape EscapeMode = iota 18 Base64Escape 19 QuotedEscape 20 ) 21 22 // EncodeJSONValue marshals the value into a JSON string, and optionally base64 23 // encodes the string before returning it. 24 // 25 // Will panic if the escape mode is unknown. 26 func EncodeJSONValue(v aws.JSONValue, escape EscapeMode) (string, error) { 27 b, err := json.Marshal(v) 28 if err != nil { 29 return "", err 30 } 31 32 switch escape { 33 case NoEscape: 34 return string(b), nil 35 case Base64Escape: 36 return base64.StdEncoding.EncodeToString(b), nil 37 case QuotedEscape: 38 return strconv.Quote(string(b)), nil 39 } 40 41 panic(fmt.Sprintf("EncodeJSONValue called with unknown EscapeMode, %v", escape)) 42 } 43 44 // DecodeJSONValue will attempt to decode the string input as a JSONValue. 45 // Optionally decoding base64 the value first before JSON unmarshaling. 46 // 47 // Will panic if the escape mode is unknown. 48 func DecodeJSONValue(v string, escape EscapeMode) (aws.JSONValue, error) { 49 var b []byte 50 var err error 51 52 switch escape { 53 case NoEscape: 54 b = []byte(v) 55 case Base64Escape: 56 b, err = base64.StdEncoding.DecodeString(v) 57 case QuotedEscape: 58 var u string 59 u, err = strconv.Unquote(v) 60 b = []byte(u) 61 default: 62 panic(fmt.Sprintf("DecodeJSONValue called with unknown EscapeMode, %v", escape)) 63 } 64 65 if err != nil { 66 return nil, err 67 } 68 69 m := aws.JSONValue{} 70 err = json.Unmarshal(b, &m) 71 if err != nil { 72 return nil, err 73 } 74 75 return m, nil 76 }