-
Notifications
You must be signed in to change notification settings - Fork 0
/
query.go
109 lines (102 loc) · 2.43 KB
/
query.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package stgin
import (
"errors"
"reflect"
"regexp"
"strconv"
"strings"
)
type queries = map[string]string
func getQueryMatcher(tpe string) *regexp.Regexp {
switch tpe {
case "int":
return intRegex
case "float":
return floatRegex
default:
return stringRegex
}
}
func acceptsQuery(tpe string, value string) bool {
if tpe == "" {
return true
} else {
return getQueryMatcher(tpe).Match([]byte(value))
}
}
func acceptsAllQueries(q queries, qs map[string][]string) bool {
var accepts = true
for name, tpe := range q {
value := qs[name]
if len(value) == 0 {
accepts = false
break
}
for _, v := range value {
if v == "" || !acceptsQuery(tpe, v) {
accepts = false
break
}
}
}
return accepts
}
func getQueryDefinitionsFromPattern(pattern string) queries {
defs := strings.SplitN(pattern, "&", -1)
qs := make(queries, 10)
for _, def := range defs {
if def != "" {
arr := strings.SplitN(def, ":", 2)
name := arr[0]
var tpe = "string"
if len(arr) == 2 {
tpe = arr[1]
}
qs[name] = tpe
}
}
return qs
}
func (c RequestContext) QueryToObj(a any) error {
if reflect.TypeOf(a).Kind() != reflect.Ptr {
return errors.New("passed raw type instead of value pointer to QueryToObj function, please use pointers instead")
}
if reflect.ValueOf(a).Kind() != reflect.Ptr {
return errors.New("passed raw value instead of value pointer to QueryToObj function, please use pointers instead")
}
tpe := reflect.TypeOf(a).Elem()
value := reflect.ValueOf(a).Elem()
for i := 0; i < tpe.NumField(); i++ {
tpeField := tpe.Field(i)
if tpeField.IsExported() {
queryTag, _ := tpeField.Tag.Lookup("qp")
if queryTag == "" {
queryTag = tpeField.Name
}
tags := strings.SplitN(queryTag, ",", -1)
queryName := tags[0]
//otherTags := tags[1:] WIP
query, found := c.GetQuery(queryName)
valueField := value.Field(i)
if found {
switch valueField.Kind() {
case reflect.String:
valueField.Set(reflect.ValueOf(query))
case reflect.Int:
if queryInt, err := strconv.Atoi(query); err == nil {
valueField.Set(reflect.ValueOf(queryInt))
}
case reflect.Float64:
if queryFloat, err := strconv.ParseFloat(query, 64); err == nil {
valueField.Set(reflect.ValueOf(queryFloat))
}
case reflect.Float32:
if queryFloat, err := strconv.ParseFloat(query, 32); err == nil {
valueField.Set(reflect.ValueOf(queryFloat))
}
}
}
}
}
return nil
}