|
@@ -1,17 +1,19 @@
|
|
package seq
|
|
package seq
|
|
|
|
|
|
import (
|
|
import (
|
|
- "fmt"
|
|
|
|
- "log"
|
|
|
|
"reflect"
|
|
"reflect"
|
|
|
|
+
|
|
|
|
+ "dev.hexasoftware.com/hxs/prettylog"
|
|
)
|
|
)
|
|
|
|
|
|
-type SeqFunc func(s *Seq) error
|
|
|
|
|
|
+var (
|
|
|
|
+ log = prettylog.New("Seq")
|
|
|
|
+)
|
|
|
|
|
|
type Entry struct {
|
|
type Entry struct {
|
|
desc string
|
|
desc string
|
|
fn reflect.Value
|
|
fn reflect.Value
|
|
- seqFn SeqFunc
|
|
|
|
|
|
+ seqFn func(sc *Context) error
|
|
param []SeqParam
|
|
param []SeqParam
|
|
ret []reflect.Value
|
|
ret []reflect.Value
|
|
grab []reflect.Value
|
|
grab []reflect.Value
|
|
@@ -24,10 +26,11 @@ type SeqParam struct {
|
|
param reflect.Value
|
|
param reflect.Value
|
|
}
|
|
}
|
|
|
|
|
|
-func P(n, i int) SeqParam {
|
|
|
|
|
|
+// Helper
|
|
|
|
+func SeqReturn(n, i int) SeqParam {
|
|
return SeqParam{1, n, i, reflect.Value{}}
|
|
return SeqParam{1, n, i, reflect.Value{}}
|
|
}
|
|
}
|
|
-func EP(n int) SeqParam {
|
|
|
|
|
|
+func ExecParam(n int) SeqParam {
|
|
return SeqParam{2, n, 0, reflect.Value{}}
|
|
return SeqParam{2, n, 0, reflect.Value{}}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -52,7 +55,8 @@ func (s *Seq) Add(params ...interface{}) *Seq {
|
|
}
|
|
}
|
|
fn := params[fni]
|
|
fn := params[fni]
|
|
|
|
|
|
- if v, ok := fn.(SeqFunc); ok {
|
|
|
|
|
|
+ if v, ok := fn.(func(s *Context) error); ok {
|
|
|
|
+ log.Println("Special func")
|
|
entry.seqFn = v
|
|
entry.seqFn = v
|
|
} else {
|
|
} else {
|
|
entry.fn = reflect.ValueOf(fn)
|
|
entry.fn = reflect.ValueOf(fn)
|
|
@@ -95,19 +99,18 @@ func (s *Seq) Grab(grab ...interface{}) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-func (s *Seq) Log(param...interface{){
|
|
|
|
-
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
func (s *Seq) Exec(eparam ...interface{}) error {
|
|
func (s *Seq) Exec(eparam ...interface{}) error {
|
|
|
|
+ sCon := NewContext()
|
|
s.rep = []string{}
|
|
s.rep = []string{}
|
|
for _, e := range s.seq {
|
|
for _, e := range s.seq {
|
|
|
|
|
|
if e.seqFn != nil {
|
|
if e.seqFn != nil {
|
|
- err := e.seqFn(s)
|
|
|
|
|
|
+ err := e.seqFn(sCon)
|
|
|
|
+ sCon.Log("E:", e.desc, "=>", err)
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
+ continue
|
|
}
|
|
}
|
|
param := []reflect.Value{}
|
|
param := []reflect.Value{}
|
|
for _, p := range e.param {
|
|
for _, p := range e.param {
|
|
@@ -116,33 +119,30 @@ func (s *Seq) Exec(eparam ...interface{}) error {
|
|
case 0:
|
|
case 0:
|
|
val = p.param
|
|
val = p.param
|
|
case 1:
|
|
case 1:
|
|
- val = s.seq[p.nres].ret[p.ires]
|
|
|
|
|
|
+ val = reflect.ValueOf(sCon.Ret(p.nres, p.ires))
|
|
case 2:
|
|
case 2:
|
|
val = reflect.Indirect(reflect.ValueOf(eparam[p.nres]))
|
|
val = reflect.Indirect(reflect.ValueOf(eparam[p.nres]))
|
|
}
|
|
}
|
|
param = append(param, val)
|
|
param = append(param, val)
|
|
}
|
|
}
|
|
- e.ret = e.fn.Call(param)
|
|
|
|
- for i, r := range e.ret { // Populate grabs
|
|
|
|
|
|
+ retVal := e.fn.Call(param)
|
|
|
|
+ iretList := []interface{}{}
|
|
|
|
+ for i, r := range retVal { // Populate grabs
|
|
if i < len(e.grab) {
|
|
if i < len(e.grab) {
|
|
e.grab[i].Elem().Set(r)
|
|
e.grab[i].Elem().Set(r)
|
|
}
|
|
}
|
|
- if err, ok := r.Interface().(error); ok {
|
|
|
|
|
|
+ iret := r.Interface()
|
|
|
|
+ if err, ok := iret.(error); ok {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
+ iretList = append(iretList, iret)
|
|
}
|
|
}
|
|
|
|
+ sCon.ret = append(sCon.ret, iretList)
|
|
if e.desc != "" { // Only if we have a description
|
|
if e.desc != "" { // Only if we have a description
|
|
- iret := []interface{}{}
|
|
|
|
- for _, r := range e.ret {
|
|
|
|
- iret = append(iret, reflect.Indirect(r).Interface())
|
|
|
|
- }
|
|
|
|
- s.rep = append(s.rep, fmt.Sprintf("E: %s => %s", e.desc, iret))
|
|
|
|
|
|
+ sCon.Log("E:", e.desc, "=>", iretList)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- log.Println("Report:")
|
|
|
|
- for _, r := range s.rep {
|
|
|
|
- log.Println(r)
|
|
|
|
- }
|
|
|
|
|
|
+ sCon.LogRep()
|
|
|
|
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|