github.com/octohelm/wagon@v0.0.0-20240308040401-88662650dc0b/pkg/engine/plan/internal/task_runner.go (about)

     1  package internal
     2  
     3  import (
     4  	"reflect"
     5  
     6  	"cuelang.org/go/cue"
     7  	"github.com/octohelm/wagon/pkg/engine/plan"
     8  	"github.com/pkg/errors"
     9  	"golang.org/x/net/context"
    10  )
    11  
    12  type taskRunner struct {
    13  	task plan.Task
    14  
    15  	inputTaskRunner reflect.Value
    16  	outputFields    map[string]int
    17  }
    18  
    19  func (t *taskRunner) Underlying() any {
    20  	return t.inputTaskRunner.Interface()
    21  }
    22  
    23  func (t *taskRunner) Path() cue.Path {
    24  	return t.task.Path()
    25  }
    26  
    27  func (t *taskRunner) Task() plan.Task {
    28  	return t.task
    29  }
    30  
    31  func (t *taskRunner) Run(ctx context.Context) (e error) {
    32  	inputStepRunner := t.inputTaskRunner.Interface().(plan.StepRunner)
    33  
    34  	if err := t.task.Decode(inputStepRunner); err != nil {
    35  		return err
    36  	}
    37  
    38  	if err := inputStepRunner.Do(ctx); err != nil {
    39  		return errors.Wrap(err, "do failed")
    40  	}
    41  
    42  	values := map[string]any{}
    43  
    44  	rv := t.inputTaskRunner
    45  
    46  	if rv.Kind() == reflect.Ptr {
    47  		rv = rv.Elem()
    48  	}
    49  
    50  	for name, i := range t.outputFields {
    51  		if name == "" {
    52  			f := rv.Field(i)
    53  			if f.Kind() == reflect.Map {
    54  				for _, k := range f.MapKeys() {
    55  					key := k.String()
    56  					if key == "$wagon" {
    57  						continue
    58  					}
    59  					values[key] = f.MapIndex(k).Interface()
    60  				}
    61  			}
    62  			continue
    63  		}
    64  		values[name] = rv.Field(i).Interface()
    65  	}
    66  
    67  	if err := t.task.Fill(values); err != nil {
    68  		return errors.Wrapf(err, "`%s`: fill results failed", t.task.Path())
    69  	}
    70  	return nil
    71  }