1515package runtime
1616
1717import (
18- "fmt"
19- stdStrs "strings"
18+ "strings"
2019
2120 "github.com/linkall-labs/vanus/internal/primitive/transform/action"
2221 "github.com/linkall-labs/vanus/internal/primitive/transform/arg"
@@ -29,9 +28,9 @@ var actionMap = map[string]newAction{}
2928
3029func AddAction (actionFn newAction ) error {
3130 a := actionFn ()
32- name := stdStrs .ToUpper (a .Name ())
31+ name := strings .ToUpper (a .Name ())
3332 if _ , exist := actionMap [name ]; exist {
34- return fmt .Errorf ("action %s has exist" , name )
33+ return errors .Errorf ("action %s has exist" , name )
3534 }
3635 actionMap [name ] = actionFn
3736 return nil
@@ -40,36 +39,64 @@ func AddAction(actionFn newAction) error {
4039func NewAction (command []interface {}) (action.Action , error ) {
4140 funcName , ok := command [0 ].(string )
4241 if ! ok {
43- return nil , fmt .Errorf ("command name must be string" )
42+ return nil , errors .Errorf ("command name must be string" )
4443 }
45- actionFn , exist := actionMap [stdStrs .ToUpper (funcName )]
44+ actionFn , exist := actionMap [strings .ToUpper (funcName )]
4645 if ! exist {
47- return nil , fmt .Errorf ("command %s not exist" , funcName )
46+ return nil , errors .Errorf ("command %s not exist" , funcName )
4847 }
4948 a := actionFn ()
5049 argNum := len (command ) - 1
5150 if argNum < a .Arity () {
52- return nil , fmt .Errorf ("command %s arg number is not enough, it need %d but only have %d" ,
51+ return nil , errors .Errorf ("command %s arg number is not enough, it need %d but only have %d" ,
5352 funcName , a .Arity (), argNum )
5453 }
55- if argNum > a .Arity () && ! a .IsVariadic () {
56- return nil , fmt .Errorf ("command %s arg number is too many, it need %d but have %d" , funcName , a .Arity (), argNum )
54+ nestAction , isNestAction := a .(action.NestAction )
55+ if ! isNestAction {
56+ if argNum > a .Arity () && ! a .IsVariadic () {
57+ return nil , errors .Errorf ("command %s arg number is too many, it need %d but have %d" , funcName , a .Arity (), argNum )
58+ }
59+ } else {
60+ argNum = a .Arity ()
5761 }
5862 args := make ([]arg.Arg , argNum )
59- for i := 1 ; i < len (command ); i ++ {
60- _arg , err := arg .NewArg (command [i ])
63+ for i := 0 ; i < len (args ); i ++ {
64+ index := i + 1
65+ _arg , err := arg .NewArg (command [index ])
6166 if err != nil {
62- return nil , errors .Wrapf (err , "command %s arg %d is invalid" , funcName , i )
67+ return nil , errors .Wrapf (err , "command %s arg %d is invalid" , funcName , index )
6368 }
64- argType := a .ArgType (i - 1 )
69+ argType := a .ArgType (i )
6570 if ! argType .Contains (_arg ) {
66- return nil , fmt .Errorf ("command %s arg %d not support type %s" , funcName , i , _arg .Type ())
71+ return nil , errors .Errorf ("command %s arg %d not support type %s" , funcName , index , _arg .Type ())
6772 }
68- args [i - 1 ] = _arg
73+ args [i ] = _arg
6974 }
7075 err := a .Init (args )
7176 if err != nil {
7277 return nil , errors .Wrapf (err , "command %s init error" , funcName )
7378 }
79+ if isNestAction {
80+ actions := make ([]action.Action , len (command )- 1 - argNum )
81+ if len (actions ) == 0 {
82+ return nil , errors .Errorf ("command %s arg number is not enough, lost function arg" , funcName )
83+ }
84+ for i := 0 ; i < len (actions ); i ++ {
85+ index := i + 1 + argNum
86+ if arr , ok := command [index ].([]interface {}); ok {
87+ _a , err := NewAction (arr )
88+ if err != nil {
89+ return nil , errors .Wrapf (err , "action %s arg %d new action failed" , funcName , index )
90+ }
91+ actions [i ] = _a
92+ } else {
93+ return nil , errors .Errorf ("arg %d is invalid" , index )
94+ }
95+ }
96+ err = nestAction .InitAction (actions )
97+ if err != nil {
98+ return nil , errors .Wrapf (err , "command %s init action error" , funcName )
99+ }
100+ }
74101 return a , nil
75102}
0 commit comments