in graph/dag.go [60:101]
func NewDagFromTask(t *Task) (*Dag, error) {
dag := NewDag()
var prevStep *Step
for _, step := range t.Steps {
if err := step.Validate(); err != nil {
return dag, err
}
if _, err := dag.AddVertex(step); err != nil {
return dag, err
}
// If the step is parallel, add it to the root
if step.ShouldExecuteImmediately() {
if err := dag.AddEdge(rootNodeID, step.ID); err != nil {
return dag, err
}
} else if step.HasNoWhen() {
// If the step has no when, add it to the root or the previous step
if prevStep == nil {
if err := dag.AddEdge(rootNodeID, step.ID); err != nil {
return dag, err
}
} else {
if err := dag.AddEdge(prevStep.ID, step.ID); err != nil {
return dag, err
}
}
} else {
// Otherwise, add edges according to when
for _, dep := range step.When {
if err := dag.AddEdge(dep, step.ID); err != nil {
return dag, err
}
}
}
prevStep = step
}
return dag, nil
}