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  }