...
1 package httpbinding
2
3 import (
4 "encoding/base64"
5 "math"
6 "math/big"
7 "net/url"
8 "strconv"
9 )
10
11
12 type QueryValue struct {
13 query url.Values
14 key string
15 append bool
16 }
17
18
19
20 func NewQueryValue(query url.Values, key string, append bool) QueryValue {
21 return QueryValue{
22 query: query,
23 key: key,
24 append: append,
25 }
26 }
27
28 func (qv QueryValue) updateKey(value string) {
29 if qv.append {
30 qv.query.Add(qv.key, value)
31 } else {
32 qv.query.Set(qv.key, value)
33 }
34 }
35
36
37 func (qv QueryValue) Blob(v []byte) {
38 encodeToString := base64.StdEncoding.EncodeToString(v)
39 qv.updateKey(encodeToString)
40 }
41
42
43 func (qv QueryValue) Boolean(v bool) {
44 qv.updateKey(strconv.FormatBool(v))
45 }
46
47
48 func (qv QueryValue) String(v string) {
49 qv.updateKey(v)
50 }
51
52
53 func (qv QueryValue) Byte(v int8) {
54 qv.Long(int64(v))
55 }
56
57
58 func (qv QueryValue) Short(v int16) {
59 qv.Long(int64(v))
60 }
61
62
63 func (qv QueryValue) Integer(v int32) {
64 qv.Long(int64(v))
65 }
66
67
68 func (qv QueryValue) Long(v int64) {
69 qv.updateKey(strconv.FormatInt(v, 10))
70 }
71
72
73 func (qv QueryValue) Float(v float32) {
74 qv.float(float64(v), 32)
75 }
76
77
78 func (qv QueryValue) Double(v float64) {
79 qv.float(v, 64)
80 }
81
82 func (qv QueryValue) float(v float64, bitSize int) {
83 switch {
84 case math.IsNaN(v):
85 qv.String(floatNaN)
86 case math.IsInf(v, 1):
87 qv.String(floatInfinity)
88 case math.IsInf(v, -1):
89 qv.String(floatNegInfinity)
90 default:
91 qv.updateKey(strconv.FormatFloat(v, 'f', -1, bitSize))
92 }
93 }
94
95
96 func (qv QueryValue) BigInteger(v *big.Int) {
97 qv.updateKey(v.String())
98 }
99
100
101 func (qv QueryValue) BigDecimal(v *big.Float) {
102 if i, accuracy := v.Int64(); accuracy == big.Exact {
103 qv.Long(i)
104 return
105 }
106 qv.updateKey(v.Text('e', -1))
107 }
108
View as plain text