-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprobe.go
106 lines (88 loc) · 1.77 KB
/
probe.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package probe
import (
"bytes"
"io"
"io/ioutil"
"os"
"github.com/go-playground/validator/v10"
"github.com/goccy/go-yaml"
)
type Probe struct {
FilePath string
workflow Workflow
config Config
}
type Config struct {
Log io.Writer
Verbose bool
}
func New(path string, v bool) *Probe {
return &Probe{
FilePath: path,
config: Config{
Log: os.Stdout,
Verbose: v,
},
}
}
func (p *Probe) Do() error {
if err := p.Load(); err != nil {
return err
}
return p.workflow.Start(p.config)
}
func (p *Probe) ExitStatus() int {
return p.workflow.exitStatus
}
func (p *Probe) Load() error {
y, err := ioutil.ReadFile(p.FilePath)
if err != nil {
return err
}
v := validator.New()
dec := yaml.NewDecoder(bytes.NewReader(y), yaml.Validator(v))
if err = dec.Decode(&p.workflow); err != nil {
return err
}
p.setDefaultsToSteps()
return nil
}
func (p *Probe) setDefaultsToSteps() {
for _, job := range p.workflow.Jobs {
if job.Defaults == nil {
continue
}
dataMap, ok := job.Defaults.(map[string]any)
if !ok {
continue
}
for key, values := range dataMap {
defaults, defok := values.(map[string]any)
if !defok {
continue
}
for _, s := range job.Steps {
if s.Uses != key {
continue
}
p.setDefaults(s.With, defaults)
}
}
}
}
func (p *Probe) setDefaults(data, defaults map[string]any) {
for key, defaultValue := range defaults {
// If key does not exist in data
if _, exists := data[key]; !exists {
data[key] = defaultValue
continue
}
// If you have a nested map with a key of data
if nestedDefault, ok := defaultValue.(map[string]any); ok {
if nestedData, ok := data[key].(map[string]any); ok {
// Recursively set default values
p.setDefaults(nestedData, nestedDefault)
}
}
}
}