-
Notifications
You must be signed in to change notification settings - Fork 2
/
callchain.go
72 lines (60 loc) · 1.89 KB
/
callchain.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
package goutil
import "reflect"
func createReflectValueArgsArray(iargs []interface{}) (args []reflect.Value) {
for _, arg := range iargs {
args = append(args, reflect.ValueOf(arg))
}
return
}
func createInterfaceArrayFromValuesArray(responseValuesArray []reflect.Value) (responseInterfaceArray []interface{}) {
for _, ri := range responseValuesArray {
responseInterfaceArray = append(responseInterfaceArray, ri.Interface())
}
return
}
func findErrorValue(responseInterfaceArray []interface{}) (err error) {
for _, res := range responseInterfaceArray {
if e, ok := res.(error); ok {
err = e
}
}
return
}
func NewChain(err error) (chain *Chain) {
return &Chain{
Error: err,
}
}
type Chain struct {
Error error
}
func (s *Chain) Returns(args ...interface{}) []interface{} {
return args
}
func (s *Chain) Call(functor interface{}, iargs ...interface{}) (responseInterfaceArray []interface{}, err error) {
responseInterfaceArray, err = CallChain(s.Error, functor, iargs...)
s.Error = err
return
}
func (s *Chain) CallP(responseInterfaceArray []interface{}, functor interface{}, iargs ...interface{}) (err error) {
err = CallChainP(s.Error, responseInterfaceArray, functor, iargs...)
s.Error = err
return
}
func CallChain(preverr error, functor interface{}, iargs ...interface{}) (responseInterfaceArray []interface{}, err error) {
if err = preverr; err == nil {
args := createReflectValueArgsArray(iargs)
responseValuesArray := reflect.ValueOf(functor).Call(args)
responseInterfaceArray = createInterfaceArrayFromValuesArray(responseValuesArray)
err = findErrorValue(responseInterfaceArray)
}
return
}
func CallChainP(preverr error, responseInterfaceArray []interface{}, functor interface{}, iargs ...interface{}) (err error) {
var res []interface{}
res, err = CallChain(preverr, functor, iargs...)
if e := UnpackArray(res, responseInterfaceArray); err == nil {
err = e
}
return
}