@@ -14,6 +14,15 @@ import (
1414const REF_PREFIX = "${{"
1515const REF_SUFFIX = "}}"
1616
17+ // eg. ${{name.kind.outputs.key}},name setgment number is 0
18+ const NAME_SEGMENT_NUM = 0
19+
20+ // eg. ${{name.kind.outputs.key}},kind setgment number is 1
21+ const KIND_SEGMENT_NUM = 1
22+
23+ // eg. ${{name.kind.outputs.key}},key setgment number is 3
24+ const REF_SEGMENT_NUM = 3
25+
1726// Change is a wrapper with a single Tool and its Action should be execute.
1827type Change struct {
1928 Tool * configloader.Tool
@@ -101,13 +110,13 @@ func execute(smgr statemanager.Manager, changes []*Change) map[string]error {
101110 var err error
102111 var returnValue map [string ]interface {}
103112
104- log .Info ( "tool raw changes: " , c .Tool .Options )
113+ log .Infof ( "Tool's raw changes are: %s. " , c .Tool .Options )
105114 // fill ref inputs
106115 err = fillRefValueWithOutputs (smgr , c .Tool .Options )
107116 if err != nil {
108117 succeeded = false
109118 }
110- log .Info ( "tool changes with filled inputs: " , c .Tool .Options )
119+ log .Infof ( "Tool's changes with filled inputs are: %s. " , c .Tool .Options )
111120
112121 switch c .ActionName {
113122 case statemanager .ActionCreate :
@@ -183,34 +192,35 @@ func handleResult(smgr statemanager.Manager, change *Change) error {
183192 return nil
184193}
185194
186- // FillInputParams fill inputs from state
195+ // fillRefValueWithOutputs fill inputs from state
187196func fillRefValueWithOutputs (smgr statemanager.Manager , options map [string ]interface {}) error {
188- // traverse options
189197 for key , value := range options {
190198 log .Debugf ("Key: %s, Value: %s." , key , value )
191199 // judge whether the value is a string
192200 if inst , ok := value .(string ); ok {
193201 // judge whether the format is ${{xxx}}
194- if strings . HasPrefix (inst , REF_PREFIX ) && strings . HasSuffix ( inst , REF_SUFFIX ) {
195- ref := strings . TrimSpace ( strings . TrimSuffix ( strings . TrimPrefix ( inst , REF_PREFIX ), REF_SUFFIX ) )
202+ if isValidRefFormat (inst ) {
203+ ref := getRefFormatString ( inst )
196204 log .Debug ("Ref inputs: " , ref )
197205 refParam := strings .Split (ref , "." )
198206 if len (refParam ) <= 3 {
199- return errors .New ("ref input format is not correct : " + ref )
207+ return errors .New ("incorrect output reference : " + ref )
200208 }
201209
202- outputs , err := smgr .GetOutputs (statemanager .GenStateKey (refParam ))
210+ outputs , err := smgr .GetOutputs (statemanager .GenStateKey (refParam [ NAME_SEGMENT_NUM ], refParam [ KIND_SEGMENT_NUM ] ))
203211 if err != nil {
204212 return err
205213 }
206214 log .Debug ("Ref outputs: " , outputs )
207215
208216 if outs , ok := outputs .(map [string ]interface {}); ok {
209217 log .Debug ("Ref outs: " , outs )
210- log .Debug ("Ref param: " , refParam [3 ])
211- options [key ] = outs [refParam [3 ]]
218+ log .Debug ("Ref param: " , refParam [REF_SEGMENT_NUM ])
212219 if value == nil {
213- return errors .New ("ref input value is null: " + refParam [3 ])
220+ return errors .New ("ref input value is null: " + refParam [REF_SEGMENT_NUM ])
221+ }
222+ if options [key ], ok = outs [refParam [REF_SEGMENT_NUM ]]; ! ok {
223+ return fmt .Errorf ("can not find %s in dependency outputs" , refParam [REF_SEGMENT_NUM ])
214224 }
215225 }
216226 }
@@ -224,3 +234,13 @@ func fillRefValueWithOutputs(smgr statemanager.Manager, options map[string]inter
224234 }
225235 return nil
226236}
237+
238+ // isValidRefFormat if the format is ${{abc}}
239+ func isValidRefFormat (ref string ) bool {
240+ return strings .HasPrefix (ref , REF_PREFIX ) && strings .HasSuffix (ref , REF_SUFFIX )
241+ }
242+
243+ // getRefFormatString get abc from ${{abc}} or ${{ abc }}
244+ func getRefFormatString (rawFormatString string ) string {
245+ return strings .TrimSpace (strings .TrimSuffix (strings .TrimPrefix (rawFormatString , REF_PREFIX ), REF_SUFFIX ))
246+ }
0 commit comments