123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- package httpbinding
- import (
- "encoding/base64"
- "math"
- "math/big"
- "net/url"
- "strconv"
- )
- // QueryValue is used to encode query key values
- type QueryValue struct {
- query url.Values
- key string
- append bool
- }
- // NewQueryValue creates a new QueryValue which enables encoding
- // a query value into the given url.Values.
- func NewQueryValue(query url.Values, key string, append bool) QueryValue {
- return QueryValue{
- query: query,
- key: key,
- append: append,
- }
- }
- func (qv QueryValue) updateKey(value string) {
- if qv.append {
- qv.query.Add(qv.key, value)
- } else {
- qv.query.Set(qv.key, value)
- }
- }
- // Blob encodes v as a base64 query string value
- func (qv QueryValue) Blob(v []byte) {
- encodeToString := base64.StdEncoding.EncodeToString(v)
- qv.updateKey(encodeToString)
- }
- // Boolean encodes v as a query string value
- func (qv QueryValue) Boolean(v bool) {
- qv.updateKey(strconv.FormatBool(v))
- }
- // String encodes v as a query string value
- func (qv QueryValue) String(v string) {
- qv.updateKey(v)
- }
- // Byte encodes v as a query string value
- func (qv QueryValue) Byte(v int8) {
- qv.Long(int64(v))
- }
- // Short encodes v as a query string value
- func (qv QueryValue) Short(v int16) {
- qv.Long(int64(v))
- }
- // Integer encodes v as a query string value
- func (qv QueryValue) Integer(v int32) {
- qv.Long(int64(v))
- }
- // Long encodes v as a query string value
- func (qv QueryValue) Long(v int64) {
- qv.updateKey(strconv.FormatInt(v, 10))
- }
- // Float encodes v as a query string value
- func (qv QueryValue) Float(v float32) {
- qv.float(float64(v), 32)
- }
- // Double encodes v as a query string value
- func (qv QueryValue) Double(v float64) {
- qv.float(v, 64)
- }
- func (qv QueryValue) float(v float64, bitSize int) {
- switch {
- case math.IsNaN(v):
- qv.String(floatNaN)
- case math.IsInf(v, 1):
- qv.String(floatInfinity)
- case math.IsInf(v, -1):
- qv.String(floatNegInfinity)
- default:
- qv.updateKey(strconv.FormatFloat(v, 'f', -1, bitSize))
- }
- }
- // BigInteger encodes v as a query string value
- func (qv QueryValue) BigInteger(v *big.Int) {
- qv.updateKey(v.String())
- }
- // BigDecimal encodes v as a query string value
- func (qv QueryValue) BigDecimal(v *big.Float) {
- if i, accuracy := v.Int64(); accuracy == big.Exact {
- qv.Long(i)
- return
- }
- qv.updateKey(v.Text('e', -1))
- }
|