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 }