pkg/runner/step_parser.go (52 lines of code) (raw):

package runner import ( "fmt" "gitlab.com/gitlab-org/step-runner/pkg/context" "gitlab.com/gitlab-org/step-runner/proto" ) type StepParser interface { Parse(globalCtx *GlobalContext, specDef *SpecDefinition, params *Params, loadedFrom StepReference) (Step, error) } type Parser struct { stepResParser *StepResourceParser } func NewParser(stepResParser *StepResourceParser) *Parser { return &Parser{ stepResParser: stepResParser, } } func (p *Parser) Parse(globalCtx *GlobalContext, specDef *SpecDefinition, params *Params, loadedFrom StepReference) (Step, error) { if err := p.validateInputs(specDef.SpecInputs(), params.Inputs); err != nil { return nil, fmt.Errorf("failed to parse spec definition: %w", err) } step, err := p.parseStepType(globalCtx, specDef, params, loadedFrom) if err != nil { return nil, fmt.Errorf("failed to parse spec definition: %w", err) } return step, nil } func (p *Parser) parseStepType(globalCtx *GlobalContext, specDef *SpecDefinition, params *Params, loadedFrom StepReference) (Step, error) { if specDef.IsTypeExec() { return NewExecutableStep(loadedFrom, params, specDef), nil } if specDef.IsTypeSteps() { var steps []Step for _, stepReference := range specDef.Steps() { stepResource, err := p.stepResParser.Parse(specDef.Dir(), stepReference.Step) if err != nil { return nil, err } steps = append(steps, NewLazilyLoadedStep(globalCtx, p, stepReference, stepResource)) } return NewSequenceOfSteps(loadedFrom, params, specDef, steps...), nil } return nil, fmt.Errorf("unknown step definition type: %s", specDef.DescribeType()) } func (p *Parser) validateInputs(specInputs map[string]*proto.Spec_Content_Input, inputs map[string]*context.Variable) error { for key, value := range specInputs { if inputs[key] == nil && value.Default == nil { return fmt.Errorf("input %q required, but not defined", key) } } return nil }