|
@@ -8,7 +8,6 @@ package flow
|
|
import (
|
|
import (
|
|
"errors"
|
|
"errors"
|
|
"fmt"
|
|
"fmt"
|
|
- "log"
|
|
|
|
"reflect"
|
|
"reflect"
|
|
"sync"
|
|
"sync"
|
|
)
|
|
)
|
|
@@ -58,16 +57,17 @@ func (o *operation) Set(data Data) {
|
|
}
|
|
}
|
|
|
|
|
|
// make Executor for func
|
|
// make Executor for func
|
|
-func (f *Flow) makeTrigger(id string, fn executorFunc) executorFunc {
|
|
|
|
|
|
+func (f *Flow) asTrigger(id string, fn executorFunc) executorFunc {
|
|
return func(ctx OpCtx, params ...Data) (Data, error) {
|
|
return func(ctx OpCtx, params ...Data) (Data, error) {
|
|
f.hooks.start(id)
|
|
f.hooks.start(id)
|
|
- d, err := fn(ctx, params...)
|
|
|
|
|
|
+ res, err := fn(ctx, params...)
|
|
if err != nil {
|
|
if err != nil {
|
|
f.hooks.error(id, err)
|
|
f.hooks.error(id, err)
|
|
- return d, err
|
|
|
|
|
|
+ } else {
|
|
|
|
+ f.hooks.finish(id, res)
|
|
}
|
|
}
|
|
- f.hooks.finish(id, d)
|
|
|
|
- return d, err
|
|
|
|
|
|
+ return res, err
|
|
|
|
+
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -81,15 +81,12 @@ func (f *Flow) makeExecutor(id string, fn interface{}) executorFunc {
|
|
defer func() {
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
if r := recover(); r != nil {
|
|
err = fmt.Errorf("%v", r)
|
|
err = fmt.Errorf("%v", r)
|
|
- f.hooks.error(id, err)
|
|
|
|
}
|
|
}
|
|
}()
|
|
}()
|
|
|
|
|
|
op := f.GetOp(id)
|
|
op := f.GetOp(id)
|
|
if op == nil {
|
|
if op == nil {
|
|
- err = fmt.Errorf("invalid operation '%s'", id)
|
|
|
|
- f.hooks.error(id, err)
|
|
|
|
- return nil, err
|
|
|
|
|
|
+ return nil, fmt.Errorf("invalid operation '%s'", id)
|
|
}
|
|
}
|
|
op.Lock()
|
|
op.Lock()
|
|
defer op.Unlock()
|
|
defer op.Unlock()
|
|
@@ -101,41 +98,36 @@ func (f *Flow) makeExecutor(id string, fn interface{}) executorFunc {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- // Wait for inputs
|
|
|
|
|
|
+ // Change to wait
|
|
f.hooks.wait(id)
|
|
f.hooks.wait(id)
|
|
|
|
|
|
fnval := reflect.ValueOf(fn)
|
|
fnval := reflect.ValueOf(fn)
|
|
callParam, err := f.processInputs(ctx, op, fnval, params...)
|
|
callParam, err := f.processInputs(ctx, op, fnval, params...)
|
|
if err != nil {
|
|
if err != nil {
|
|
- log.Println("ERR:", err)
|
|
|
|
- f.hooks.error(id, err)
|
|
|
|
return nil, err
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
|
|
- // The actual operation process
|
|
|
|
-
|
|
|
|
- // Func returned starting the process
|
|
|
|
|
|
+ // Start again
|
|
f.hooks.start(id)
|
|
f.hooks.start(id)
|
|
- // if entry is special we pass the Flow?
|
|
|
|
fnret := fnval.Call(callParam)
|
|
fnret := fnval.Call(callParam)
|
|
|
|
+ if len(fnret) == 0 {
|
|
|
|
+ return nil, nil
|
|
|
|
+ }
|
|
// Output erroring
|
|
// Output erroring
|
|
if len(fnret) > 1 && (fnret[len(fnret)-1].Interface() != nil) {
|
|
if len(fnret) > 1 && (fnret[len(fnret)-1].Interface() != nil) {
|
|
- err, ok := fnret[1].Interface().(error)
|
|
|
|
|
|
+ err, ok := fnret[len(fnret)-1].Interface().(error)
|
|
if !ok {
|
|
if !ok {
|
|
err = errors.New("unknown error")
|
|
err = errors.New("unknown error")
|
|
}
|
|
}
|
|
- f.hooks.error(id, err)
|
|
|
|
return nil, err
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
|
|
// THE RESULT
|
|
// THE RESULT
|
|
ret := fnret[0].Interface()
|
|
ret := fnret[0].Interface()
|
|
-
|
|
|
|
// Store in the cache
|
|
// Store in the cache
|
|
if ctx != nil {
|
|
if ctx != nil {
|
|
ctx.Store(id, ret)
|
|
ctx.Store(id, ret)
|
|
}
|
|
}
|
|
- f.hooks.finish(id, ret)
|
|
|
|
return ret, nil
|
|
return ret, nil
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -213,11 +205,6 @@ func (f *Flow) processInputs(ctx OpCtx, op *operation, fnval reflect.Value, para
|
|
if callErrors != "" {
|
|
if callErrors != "" {
|
|
return nil, errors.New(callErrors)
|
|
return nil, errors.New(callErrors)
|
|
}
|
|
}
|
|
- /*offs := 0
|
|
|
|
- if fnval.Type().NumIn() > 0 && fnval.Type().In(0) == reflect.TypeOf(f) {
|
|
|
|
- nInputs--
|
|
|
|
- offs = 1
|
|
|
|
- }*/
|
|
|
|
|
|
|
|
return OcallParam, nil
|
|
return OcallParam, nil
|
|
}
|
|
}
|
|
@@ -242,7 +229,7 @@ func (f *Flow) DefVar(id string, name string, initial ...Data) Operation {
|
|
kind: "var",
|
|
kind: "var",
|
|
inputs: nil,
|
|
inputs: nil,
|
|
setter: setter,
|
|
setter: setter,
|
|
- executor: f.makeTrigger(id, func(OpCtx, ...Data) (Data, error) {
|
|
|
|
|
|
+ executor: f.asTrigger(id, func(OpCtx, ...Data) (Data, error) {
|
|
// if f.data == nil we set from the init operation
|
|
// if f.data == nil we set from the init operation
|
|
return f.Data[name], nil
|
|
return f.Data[name], nil
|
|
}),
|
|
}),
|
|
@@ -280,7 +267,7 @@ func (f *Flow) DefOp(id string, name string, params ...interface{}) (Operation,
|
|
kind: "func",
|
|
kind: "func",
|
|
inputs: inputs,
|
|
inputs: inputs,
|
|
setter: nil, // No set
|
|
setter: nil, // No set
|
|
- executor: executor,
|
|
|
|
|
|
+ executor: f.asTrigger(id, executor),
|
|
}
|
|
}
|
|
f.operations.Store(id, op)
|
|
f.operations.Store(id, op)
|
|
|
|
|
|
@@ -298,7 +285,7 @@ func (f *Flow) DefErrOp(id string, err error) (Operation, error) {
|
|
kind: "error",
|
|
kind: "error",
|
|
inputs: nil,
|
|
inputs: nil,
|
|
setter: nil,
|
|
setter: nil,
|
|
- executor: f.makeTrigger(id, func(OpCtx, ...Data) (Data, error) { return nil, err }),
|
|
|
|
|
|
+ executor: f.asTrigger(id, func(OpCtx, ...Data) (Data, error) { return nil, err }),
|
|
}
|
|
}
|
|
f.operations.Store(id, op)
|
|
f.operations.Store(id, op)
|
|
return op, nil
|
|
return op, nil
|
|
@@ -317,7 +304,7 @@ func (f *Flow) DefConst(id string, value Data) (Operation, error) {
|
|
kind: "const",
|
|
kind: "const",
|
|
inputs: nil,
|
|
inputs: nil,
|
|
setter: nil,
|
|
setter: nil,
|
|
- executor: f.makeTrigger(id, func(OpCtx, ...Data) (Data, error) { return f.consts[id], nil }),
|
|
|
|
|
|
+ executor: f.asTrigger(id, func(OpCtx, ...Data) (Data, error) { return f.consts[id], nil }),
|
|
}
|
|
}
|
|
f.operations.Store(id, op)
|
|
f.operations.Store(id, op)
|
|
|
|
|
|
@@ -334,7 +321,7 @@ func (f *Flow) DefIn(id string, paramID int) Operation {
|
|
kind: "in",
|
|
kind: "in",
|
|
inputs: nil,
|
|
inputs: nil,
|
|
setter: nil,
|
|
setter: nil,
|
|
- executor: f.makeTrigger(id, func(ctx OpCtx, params ...Data) (Data, error) { return params[paramID], nil }),
|
|
|
|
|
|
+ executor: f.asTrigger(id, func(ctx OpCtx, params ...Data) (Data, error) { return params[paramID], nil }),
|
|
}
|
|
}
|
|
f.operations.Store(id, op)
|
|
f.operations.Store(id, op)
|
|
return op
|
|
return op
|