github.com/getgauge/gauge@v1.6.9/execution/resolve.go (about) 1 /*---------------------------------------------------------------- 2 * Copyright (c) ThoughtWorks, Inc. 3 * Licensed under the Apache License, Version 2.0 4 * See LICENSE in the project root for license information. 5 *----------------------------------------------------------------*/ 6 7 package execution 8 9 import ( 10 "github.com/getgauge/gauge-proto/go/gauge_messages" 11 "github.com/getgauge/gauge/gauge" 12 "github.com/getgauge/gauge/parser" 13 ) 14 15 type setSkipInfoFn func(protoStep *gauge_messages.ProtoStep, step *gauge.Step) 16 17 func resolveItems(items []gauge.Item, lookup *gauge.ArgLookup, skipFn setSkipInfoFn) ([]*gauge_messages.ProtoItem, error) { 18 var protoItems []*gauge_messages.ProtoItem 19 for _, item := range items { 20 if item.Kind() != gauge.TearDownKind { 21 protoItem, err := resolveToProtoItem(item, lookup, skipFn) 22 if err != nil { 23 return nil, err 24 } 25 protoItems = append(protoItems, protoItem) 26 } 27 } 28 return protoItems, nil 29 } 30 31 func resolveToProtoItem(item gauge.Item, lookup *gauge.ArgLookup, skipFn setSkipInfoFn) (*gauge_messages.ProtoItem, error) { 32 var protoItem *gauge_messages.ProtoItem 33 var err error 34 switch item.Kind() { 35 case gauge.StepKind: 36 if (item.(*gauge.Step)).IsConcept { 37 concept := item.(*gauge.Step) 38 protoItem, err = resolveToProtoConceptItem(*concept, lookup, skipFn) 39 } else { 40 protoItem, err = resolveToProtoStepItem(item.(*gauge.Step), lookup, skipFn) 41 } 42 default: 43 protoItem = gauge.ConvertToProtoItem(item) 44 } 45 return protoItem, err 46 } 47 48 // Not passing pointer as we cannot modify the original concept step's lookup. This has to be populated for each iteration over data table. 49 func resolveToProtoConceptItem(concept gauge.Step, lookup *gauge.ArgLookup, skipFn setSkipInfoFn) (*gauge_messages.ProtoItem, error) { 50 if err := parser.PopulateConceptDynamicParams(&concept, lookup); err != nil { 51 return nil, err 52 } 53 protoConceptItem := gauge.ConvertToProtoItem(&concept) 54 protoConceptItem.Concept.ConceptStep.StepExecutionResult = &gauge_messages.ProtoStepExecutionResult{} 55 for stepIndex, step := range concept.ConceptSteps { 56 // Need to reset parent as the step.parent is pointing to a concept whose lookup is not populated yet 57 if step.IsConcept { 58 step.Parent = &concept 59 protoItem, err := resolveToProtoConceptItem(*step, &concept.Lookup, skipFn) 60 if err != nil { 61 return nil, err 62 } 63 protoConceptItem.GetConcept().GetSteps()[stepIndex] = protoItem 64 } else { 65 conceptStep := protoConceptItem.Concept.Steps[stepIndex].Step 66 err := parser.Resolve(step, &concept, &concept.Lookup, conceptStep) 67 if err != nil { 68 return nil, err 69 } 70 skipFn(conceptStep, step) 71 } 72 } 73 protoConceptItem.Concept.ConceptStep.StepExecutionResult.Skipped = false 74 return protoConceptItem, nil 75 } 76 77 func resolveToProtoStepItem(step *gauge.Step, lookup *gauge.ArgLookup, skipFn setSkipInfoFn) (*gauge_messages.ProtoItem, error) { 78 protoStepItem := gauge.ConvertToProtoItem(step) 79 err := parser.Resolve(step, nil, lookup, protoStepItem.Step) 80 if err != nil { 81 return nil, err 82 } 83 skipFn(protoStepItem.Step, step) 84 return protoStepItem, err 85 }