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