-
Notifications
You must be signed in to change notification settings - Fork 52
/
inject.go
77 lines (71 loc) · 1.39 KB
/
inject.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
package znet
import (
"reflect"
"github.com/sohaha/zlsgo/zdi"
)
func handlerFuncs(h []Handler) []handlerFn {
more := make([]handlerFn, len(h))
for i := range h {
more[i] = handlerFunc(h[i])
}
return more
}
func invokeHandler(c *Context, v []reflect.Value) (err error) {
for i := range v {
value := v[i]
v := value.Interface()
switch vv := v.(type) {
case int:
c.prevData.Code.Store(int32(vv))
case int32:
c.prevData.Code.Store(vv)
case uint:
c.prevData.Code.Store(int32(vv))
case string:
c.render = &renderString{Format: vv}
case error:
err = vv
case []byte:
c.render = &renderByte{Data: vv}
case ApiData:
c.render = &renderJSON{Data: vv}
}
}
return
}
func handlerFunc(h Handler) (fn handlerFn) {
switch v := h.(type) {
case func(*Context):
return func(c *Context) error {
v(c)
return nil
}
case handlerFn:
return v
case zdi.PreInvoker:
return func(c *Context) error {
v, err := c.injector.Invoke(v)
if err != nil {
return err
}
if len(v) == 0 {
return nil
}
return invokeHandler(c, v)
}
case func() (int, string):
return func(c *Context) error {
v, err := c.injector.Invoke(invokerCodeText(v))
c.String(int32(v[0].Int()), v[1].String())
return err
}
default:
return func(c *Context) error {
v, err := c.injector.Invoke(v)
if err != nil {
return err
}
return invokeHandler(c, v)
}
}
}