/
arch.go
92 lines (75 loc) · 1.65 KB
/
arch.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
package api
import (
"fmt"
)
type Arch uint
const (
ArchAll Arch = iota
ArchAMD64
ArchAArch64
ArchX86
)
var allSupportedArches = map[Arch]struct{}{
ArchAll: {},
ArchAMD64: {},
ArchAArch64: {},
ArchX86: {},
}
func sprintfBogusArch(raw uint) string {
return fmt.Sprintf("Arch(%d)", raw)
}
func emptyBogusArch(raw uint) string {
return ""
}
const (
ourArchIdx = iota
omahaArchIdx
coreosArchIdx
)
var archStringData = [][3]string{
// our string, omaha string, coreos string
{"all", "", ""},
{"amd64", "x64", "amd64-usr"},
{"aarch64", "arm", "arm64-usr"},
{"x86", "x86", ""},
}
func (a Arch) toString(kindIdx int, bogus func(uint) string) string {
archIdx := int(a)
if archIdx < len(archStringData) {
return archStringData[archIdx][kindIdx]
}
return bogus(uint(a))
}
func (a Arch) String() string {
return a.toString(ourArchIdx, sprintfBogusArch)
}
func (a Arch) OmahaString() string {
return a.toString(omahaArchIdx, emptyBogusArch)
}
func (a Arch) CoreosString() string {
return a.toString(coreosArchIdx, emptyBogusArch)
}
func (a Arch) IsValid() bool {
_, ok := allSupportedArches[a]
return ok
}
func pkgArchFromIdxString(s string, idx int) (Arch, error) {
if s == "" {
return 0, ErrInvalidArch
}
for i := 0; i < len(archStringData); i++ {
if s == archStringData[i][idx] {
return Arch(i), nil
}
}
return ArchAll, ErrInvalidArch
}
func ArchFromString(s string) (Arch, error) {
return pkgArchFromIdxString(s, ourArchIdx)
}
func ArchFromOmahaString(s string) (Arch, error) {
return pkgArchFromIdxString(s, omahaArchIdx)
}
func ArchFromCoreosString(s string) (Arch, error) {
return pkgArchFromIdxString(s, coreosArchIdx)
}