/
env_runtimes.go
102 lines (86 loc) · 2.81 KB
/
env_runtimes.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
package entities
import (
"strings"
"github.com/asaskevich/govalidator"
)
const envRuntimesLatestFlag = "latest"
type envAvailableRuntime struct {
versionRegExp string
versionExamples []string
}
var (
envRuntimesSemverRegExp = `^((?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9]\d*)(?:-(?P<prerelease>(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?P<buildmetadata>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?|latest)$`
envRuntimesLatestRegExp = "^" + envRuntimesLatestFlag + "$"
envRuntimesPHPVersionRegExp = `^((?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)|latest)$`
envAvailableRuntimes = map[string]envAvailableRuntime{
"clang": {
versionRegExp: envRuntimesLatestRegExp,
versionExamples: []string{"latest"},
},
"docker": {
versionRegExp: envRuntimesLatestRegExp,
versionExamples: []string{"latest"},
},
"go": {
versionRegExp: envRuntimesSemverRegExp,
versionExamples: []string{"latest", "1.19.2", "1.19.0", "1.0.0"},
},
"java": {
versionRegExp: envRuntimesLatestRegExp,
versionExamples: []string{"latest"},
},
"node": {
versionRegExp: envRuntimesSemverRegExp,
versionExamples: []string{"latest", "18.11.0", "18.0.0", "16.18.0"},
},
"php": {
versionRegExp: envRuntimesPHPVersionRegExp,
versionExamples: []string{"latest", "8.11", "8.0", "7.4"},
},
"python": {
versionRegExp: envRuntimesSemverRegExp,
versionExamples: []string{"latest", "3.10.8", "3.0.0", "2.7.0"},
},
"ruby": {
versionRegExp: envRuntimesSemverRegExp,
versionExamples: []string{"latest", "3.1.2", "3.0.0", "2.7.0"},
},
"rust": {
versionRegExp: envRuntimesSemverRegExp,
versionExamples: []string{"latest", "1.64.0", "1.62.1", "1.0.0"},
},
}
)
type EnvRuntimes map[string]string
func ParseEnvRuntimes(runtimes []string) (EnvRuntimes, error) {
parsedRuntimes := EnvRuntimes{}
for _, runtime := range runtimes {
runtimeName, runtimeVersion, _ := strings.Cut(runtime, "@")
if _, runtimeAvailable := envAvailableRuntimes[runtimeName]; !runtimeAvailable {
return nil, ErrEnvInvalidRuntime{
Runtime: runtimeName,
}
}
if _, runtimeAlreadyParsed := parsedRuntimes[runtimeName]; runtimeAlreadyParsed {
return nil, ErrEnvDuplicatedRuntimes{
Runtime: runtimeName,
}
}
if len(runtimeVersion) == 0 {
runtimeVersion = envRuntimesLatestFlag
}
validRuntimeVersion := govalidator.Matches(
runtimeVersion,
envAvailableRuntimes[runtimeName].versionRegExp,
)
if !validRuntimeVersion {
return nil, ErrEnvInvalidRuntimeVersion{
Runtime: runtimeName,
RuntimeVersion: runtimeVersion,
RuntimeVersionExamples: envAvailableRuntimes[runtimeName].versionExamples,
}
}
parsedRuntimes[runtimeName] = runtimeVersion
}
return parsedRuntimes, nil
}