-
Notifications
You must be signed in to change notification settings - Fork 0
/
option_internal.go
158 lines (134 loc) · 4.87 KB
/
option_internal.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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
package inreq
import (
"net/http"
"github.com/rrgmc/instruct"
"github.com/rrgmc/instruct/options"
)
const (
DefaultTagName = "inreq"
)
type sharedDefaultOptions struct {
sliceSplitSeparator string // string to be used as separator on string-to-array conversion. Default is ",".
pathValue PathValue // function used to extract the path from the request.
bodyDecoder BodyDecoder // interface to decode body to struct. Default one handles JSON and XML.
defaultDecodeOptions decodeOptions // default decode options.
}
type defaultOptions struct {
options instruct.DefaultOptions[*http.Request, DecodeContext]
sharedDefaultOptions
}
func (d *defaultOptions) apply(options ...DefaultOption) {
for _, opt := range options {
opt.ApplyDefaultOption(d)
}
}
type typeDefaultOptions struct {
options instruct.TypeDefaultOptions[*http.Request, DecodeContext]
sharedDefaultOptions
}
func (d *typeDefaultOptions) apply(options ...TypeDefaultOption) {
for _, opt := range options {
opt.ApplyTypeDefaultOption(d)
}
}
type decodeOptions struct {
options instruct.DecodeOptions[*http.Request, DecodeContext]
allowReadBody bool // whether operations are allowed to read the request body.
ensureAllQueryUsed bool // whether to check if all query parameters were used.
ensureAllFormUsed bool // whether to check if all form parameters were used.
}
func (d *decodeOptions) apply(options ...DecodeOption) {
for _, opt := range options {
opt.ApplyDecodeOption(d)
}
}
func (d *decodeOptions) applyType(options ...TypeDecodeOption) {
for _, opt := range options {
opt.ApplyTypeDecodeOption(d)
}
}
func defaultSharedDefaultOptions() sharedDefaultOptions {
ret := sharedDefaultOptions{
sliceSplitSeparator: ",",
bodyDecoder: NewDefaultBodyDecoder(),
defaultDecodeOptions: defaultDecodeOptions(),
}
return ret
}
func defaultDefaultOptions() defaultOptions {
ret := defaultOptions{
options: instruct.NewDefaultOptions[*http.Request, DecodeContext](),
sharedDefaultOptions: defaultSharedDefaultOptions(),
}
ret.options.TagName = DefaultTagName
return ret
}
func defaultTypeDefaultOptions() typeDefaultOptions {
ret := typeDefaultOptions{
options: instruct.NewTypeDefaultOptions[*http.Request, DecodeContext](),
sharedDefaultOptions: defaultSharedDefaultOptions(),
}
ret.options.TagName = DefaultTagName
return ret
}
func defaultDecodeOptions() decodeOptions {
return decodeOptions{
options: instruct.NewDecodeOptions[*http.Request, DecodeContext](),
allowReadBody: true,
}
}
// helpers
func defaultAndTypeDefaultOptionFunc(f func(o *instruct.DefaultOptions[*http.Request, DecodeContext])) DefaultAndTypeDefaultOption {
return options.DefaultAndTypeDefaultOptionFunc[*http.Request, DecodeContext, defaultOptions, typeDefaultOptions](func(o *defaultOptions) {
f(&o.options)
}, func(o *typeDefaultOptions) {
f(&o.options.DefaultOptions)
})
}
func typeDefaultOptionFunc(f func(o *typeDefaultOptions)) TypeDefaultOption {
return options.TypeDefaultOptionFunc[*http.Request, DecodeContext, typeDefaultOptions](func(o *typeDefaultOptions) {
f(o)
})
}
func decodeOptionFunc(f func(o *decodeOptions)) DecodeOption {
return options.DecodeOptionFunc[*http.Request, DecodeContext, decodeOptions](func(o *decodeOptions) {
f(o)
})
}
func typeDecodeOptionFunc(f func(o *decodeOptions)) TypeDecodeOption {
return options.TypeDecodeOptionFunc[*http.Request, DecodeContext, decodeOptions](func(o *decodeOptions) {
f(o)
})
}
func defaultAndTypeDefaultSharedOptionFunc(f func(o *sharedDefaultOptions)) DefaultAndTypeDefaultOption {
return options.DefaultAndTypeDefaultOptionFunc[*http.Request, DecodeContext, defaultOptions, typeDefaultOptions](func(o *defaultOptions) {
f(&o.sharedDefaultOptions)
}, func(o *typeDefaultOptions) {
f(&o.sharedDefaultOptions)
})
}
func typeAndTypeDecodeOptionFunc(tf func(o *typeDefaultOptions), cf func(o *decodeOptions)) TypeDefaultAndTypeDecodeOption {
return options.TypeDefaultAndTypeDecodeOptionFunc[*http.Request, DecodeContext, typeDefaultOptions, decodeOptions](func(o *typeDefaultOptions) {
tf(o)
}, func(o *decodeOptions) {
cf(o)
})
}
func typeAndDecodeOptionFunc(tf func(o *typeDefaultOptions), cf func(o *decodeOptions)) TypeDefaultAndDecodeOption {
return options.TypeDefaultAndDecodeOptionFunc[*http.Request, DecodeContext, typeDefaultOptions, decodeOptions](func(o *typeDefaultOptions) {
tf(o)
}, func(o *decodeOptions) {
cf(o)
})
}
func fullSharedOptionFunc(def func(o *sharedDefaultOptions), dec func(o *decodeOptions)) FullOption {
return options.FullOptionFunc[*http.Request, DecodeContext, defaultOptions, typeDefaultOptions, decodeOptions, decodeOptions](func(o *defaultOptions) {
def(&o.sharedDefaultOptions)
}, func(o *typeDefaultOptions) {
def(&o.sharedDefaultOptions)
}, func(o *decodeOptions) {
dec(o)
}, func(o *decodeOptions) {
dec(o)
})
}