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  }