-
Notifications
You must be signed in to change notification settings - Fork 34
/
req_tsfm_factory.go
83 lines (70 loc) · 2.07 KB
/
req_tsfm_factory.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
package httptransport
import (
"context"
"net/http"
"reflect"
"sync"
"github.com/machinefi/w3bstream/pkg/depends/kit/httptransport/transformer"
"github.com/machinefi/w3bstream/pkg/depends/kit/validator"
"github.com/machinefi/w3bstream/pkg/depends/x/reflectx"
"github.com/machinefi/w3bstream/pkg/depends/x/typesx"
)
type RequestTsfmFactory struct {
Vldt validator.Factory
Tsfm transformer.Factory
cache sync.Map
}
func NewRequestTsfmFactory(tsfm transformer.Factory, vldt validator.Factory) *RequestTsfmFactory {
r := &RequestTsfmFactory{Vldt: vldt, Tsfm: tsfm}
r.SetDefault()
return r
}
func (f *RequestTsfmFactory) SetDefault() {
if f.Vldt == nil {
f.Vldt = validator.DefaultFactory
}
if f.Tsfm == nil {
f.Tsfm = transformer.DefaultFactory
}
}
func (f *RequestTsfmFactory) NewRequest(method, url string, v interface{}) (*http.Request, error) {
return f.NewRequestWithContext(context.Background(), method, url, v)
}
func (f *RequestTsfmFactory) NewRequestWithContext(ctx context.Context, method, url string, v interface{}) (*http.Request, error) {
if v == nil {
return http.NewRequestWithContext(ctx, method, url, nil)
}
rt, err := f.NewRequestTsfm(AsRequestOut(ctx), reflect.TypeOf(v))
if err != nil {
return nil, err
}
return rt.NewReqWithContext(ctx, method, url, v)
}
func (f *RequestTsfmFactory) NewRequestTsfm(ctx context.Context, typ reflect.Type) (*RequestTsfm, error) {
if v, ok := f.cache.Load(typ); ok {
return v.(*RequestTsfm), nil
}
t, err := f.new(ctx, typ)
if err != nil {
return nil, err
}
f.cache.Store(typ, t)
return t, nil
}
func (f *RequestTsfmFactory) new(ctx context.Context, typ reflect.Type) (*RequestTsfm, error) {
rt := &RequestTsfm{}
rt.Params = map[string][]transformer.ReqParam{}
rt.Type = reflectx.DeRef(typ)
ctx = transformer.ContextWithFactory(ctx, f.Tsfm)
ctx = validator.ContextWithFactory(ctx, f.Vldt)
err := transformer.EachReqParam(
ctx, typesx.FromReflectType(rt.Type),
func(rp *transformer.ReqParam) {
if rp.In == "" {
return
}
rt.Params[rp.In] = append(rt.Params[rp.In], *rp)
},
)
return rt, err
}