-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparse_filter.go
118 lines (107 loc) · 2.92 KB
/
parse_filter.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
110
111
112
113
114
115
116
117
118
package f8n
import (
"net/http"
"strings"
kitModuleAns "github.com/webnice/kit/v4/module/ans"
)
// ParseFilter Загрузка простой фильтрации.
func (f8n *impl) ParseFilter(rq *http.Request) (ret []*ParseError) {
var (
err []*ParseError
filters []string
filter Filter
n int
)
if filters = rq.URL.Query()[keyFilter]; len(filters) == 0 {
return
}
for n = range filters {
if filter, err = f8n.parseFilterSimple(filters[n]); len(err) > 0 {
ret = append(ret, err...)
continue
}
f8n.Filter = append(f8n.Filter, filter)
}
return
}
// Разбор значения простой фильтрации.
func (f8n *impl) parseFilterSimple(s string) (ret Filter, err []*ParseError) {
const nSection = 3
var (
e error
tmp []string
ero *ParseError
n int
found bool
tpe FieldType
)
// Проверка формата.
if tmp = strings.SplitN(s, keyDelimiter, nSection); len(tmp) != nSection {
ero = &ParseError{Ei: f8n.Errors().FilterFormat()}
ero.Ev = append(ero.Ev, kitModuleAns.RestErrorField{
Field: keyFilter,
FieldValue: s,
Message: ero.Ei.Error(),
})
err = append(err, ero)
return
}
// Проверка константы метода фильтрации.
if ret.Method = parseFilterMethod(tmp[1]); ret.Method == filterUnknown {
ero = &ParseError{Ei: f8n.Errors().FilterUnknownMethod(tmp[1])}
ero.Ev = append(ero.Ev, kitModuleAns.RestErrorField{
Field: keyFilter,
FieldValue: tmp[1],
Message: ero.Ei.Error(),
})
err = append(err, ero)
return
}
// Если заданы поля, проверка имени поля фильтрации.
if ret.Field = tmp[0]; len(f8n.FieldOnly) > 0 {
for n = range f8n.FieldOnly {
if f8n.FieldOnly[n] == ret.Field {
found = true
}
}
if !found {
ero = &ParseError{Ei: f8n.Errors().FilterUnknownField(ret.Field)}
ero.Ev = append(ero.Ev, kitModuleAns.RestErrorField{
Field: keyFilter,
FieldValue: ret.Field,
Message: ero.Ei.Error(),
})
err = append(err, ero)
return
}
}
// Присвоения значения фильтрации.
ret.Value = FilterValue{Source: tmp[2], Type: TypeString}
if tpe, found = f8n.Datatype[ret.Field]; found {
ret.Value.Type = tpe
}
// Тестирование значения.
if e = ret.Value.Test(); e != nil {
ero = &ParseError{Ei: f8n.Errors().FilterValueType(ret.Value.Source, ret.Value.Type, e)}
ero.Ev = append(ero.Ev, kitModuleAns.RestErrorField{
Field: keyFilter,
FieldValue: s,
Message: ero.Ei.Error(),
})
err = append(err, ero)
return
}
return
}
// Экспорт простой фильтрации.
func (f8n *impl) exportFilter() (key string, val []string) {
var n int
if len(f8n.Filter) == 0 {
return
}
key, val = keyFilter, make([]string, 0, len(f8n.Filter))
for n = range f8n.Filter {
val = append(val, f8n.Filter[n].exportAsString())
}
return
}