123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- package httpbinding
- import (
- "math"
- "math/big"
- "strconv"
- "strings"
- )
- // URIValue is used to encode named URI parameters
- type URIValue struct {
- path, rawPath, buffer *[]byte
- key string
- }
- func newURIValue(path *[]byte, rawPath *[]byte, buffer *[]byte, key string) URIValue {
- return URIValue{path: path, rawPath: rawPath, buffer: buffer, key: key}
- }
- func (u URIValue) modifyURI(value string) (err error) {
- *u.path, *u.buffer, err = replacePathElement(*u.path, *u.buffer, u.key, value, false)
- if err != nil {
- return err
- }
- *u.rawPath, *u.buffer, err = replacePathElement(*u.rawPath, *u.buffer, u.key, value, true)
- return err
- }
- // Boolean encodes v as a URI string value
- func (u URIValue) Boolean(v bool) error {
- return u.modifyURI(strconv.FormatBool(v))
- }
- // String encodes v as a URI string value
- func (u URIValue) String(v string) error {
- return u.modifyURI(v)
- }
- // Byte encodes v as a URI string value
- func (u URIValue) Byte(v int8) error {
- return u.Long(int64(v))
- }
- // Short encodes v as a URI string value
- func (u URIValue) Short(v int16) error {
- return u.Long(int64(v))
- }
- // Integer encodes v as a URI string value
- func (u URIValue) Integer(v int32) error {
- return u.Long(int64(v))
- }
- // Long encodes v as a URI string value
- func (u URIValue) Long(v int64) error {
- return u.modifyURI(strconv.FormatInt(v, 10))
- }
- // Float encodes v as a query string value
- func (u URIValue) Float(v float32) error {
- return u.float(float64(v), 32)
- }
- // Double encodes v as a query string value
- func (u URIValue) Double(v float64) error {
- return u.float(v, 64)
- }
- func (u URIValue) float(v float64, bitSize int) error {
- switch {
- case math.IsNaN(v):
- return u.String(floatNaN)
- case math.IsInf(v, 1):
- return u.String(floatInfinity)
- case math.IsInf(v, -1):
- return u.String(floatNegInfinity)
- default:
- return u.modifyURI(strconv.FormatFloat(v, 'f', -1, bitSize))
- }
- }
- // BigInteger encodes v as a query string value
- func (u URIValue) BigInteger(v *big.Int) error {
- return u.modifyURI(v.String())
- }
- // BigDecimal encodes v as a query string value
- func (u URIValue) BigDecimal(v *big.Float) error {
- if i, accuracy := v.Int64(); accuracy == big.Exact {
- return u.Long(i)
- }
- return u.modifyURI(v.Text('e', -1))
- }
- // SplitURI parses a Smithy HTTP binding trait URI
- func SplitURI(uri string) (path, query string) {
- queryStart := strings.IndexRune(uri, '?')
- if queryStart == -1 {
- path = uri
- return path, query
- }
- path = uri[:queryStart]
- if queryStart+1 >= len(uri) {
- return path, query
- }
- query = uri[queryStart+1:]
- return path, query
- }
|