1package exec
2
3import (
4	"errors"
5
6	"github.com/concourse/concourse/atc"
7	"github.com/concourse/concourse/atc/runtime"
8)
9
10func NewVersionSourceFromPlan(getPlan *atc.GetPlan) VersionSource {
11	if getPlan.Version != nil {
12		return &StaticVersionSource{
13			version: *getPlan.Version,
14		}
15	} else if getPlan.VersionFrom != nil {
16		return &PutStepVersionSource{
17			planID: *getPlan.VersionFrom,
18		}
19	} else {
20		return &EmptyVersionSource{}
21	}
22}
23
24type VersionSource interface {
25	Version(RunState) (atc.Version, error)
26}
27
28type StaticVersionSource struct {
29	version atc.Version
30}
31
32func (p *StaticVersionSource) Version(RunState) (atc.Version, error) {
33	return p.version, nil
34}
35
36var ErrPutStepVersionMissing = errors.New("version is missing from put step")
37
38type PutStepVersionSource struct {
39	planID atc.PlanID
40}
41
42func (p *PutStepVersionSource) Version(state RunState) (atc.Version, error) {
43	var info runtime.VersionResult
44	if !state.Result(p.planID, &info) {
45		return atc.Version{}, ErrPutStepVersionMissing
46	}
47
48	return info.Version, nil
49}
50
51type EmptyVersionSource struct{}
52
53func (p *EmptyVersionSource) Version(RunState) (atc.Version, error) {
54	return atc.Version{}, nil
55}
56