12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- 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
- }
|