-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdata_version.go
94 lines (83 loc) · 1.96 KB
/
data_version.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
package lure
import (
"fmt"
"math"
"strconv"
"strings"
)
// VersionData ...
type VersionData struct {
major, minor, patch int
}
// NewVersionFromString parses version from string (`v3.2.1`)
func NewVersionFromString(ver string) (VersionData, error) {
splits := strings.Split(strings.TrimLeft(ver, "vV"), ".")
verArr := make([]int, 3)
for i := 0; i < 3 && i < len(splits); i++ {
n, e := strconv.Atoi(splits[i])
if e != nil {
return VersionData{}, e
}
verArr[i] = n
}
return VersionData{
major: verArr[0],
minor: verArr[1],
patch: verArr[2],
}, nil
}
func (VersionData) extKey() string {
return "semver"
}
// compareTo compares me with rhs
// if both are valid return meaningful comparison int
// if rhs is nil, return 1
// if rhs is not a version, try convert and then compare
// if rhs cannot be casted to version, return INT_MIN
func (me VersionData) compareTo(rhs IData) int {
if rhs == nil {
return 1
}
if rv, ok := rhs.(VersionData); ok {
if me.major != rv.major {
return me.major - rv.major
}
if me.minor != rv.minor {
return me.minor - rv.minor
}
if me.patch != rv.patch {
return me.patch - rv.patch
}
return 0
}
if rv, err := NewVersionFromString(rhs.toString()); err == nil {
return me.compareTo(rv)
}
return math.MinInt32
}
func (me VersionData) toBoolean() bool {
return !(me.major == 0 && me.minor == 0 && me.patch == 0)
}
func (me VersionData) toInt() int {
if i, err := strconv.Atoi(fmt.Sprintf("%d%d%d", me.major, me.minor, me.patch)); err == nil {
return i
}
return 0
}
func (me VersionData) toDouble() float64 {
return float64(me.toInt())
}
func (me VersionData) toString() string {
return fmt.Sprintf("v%d.%d.%d", me.major, me.minor, me.patch)
}
// VersionDataConstructor constructs VersionData from raw string
func VersionDataConstructor(raw string, extKey string) IData {
if ver, err := NewVersionFromString(raw); err == nil {
return ver
}
return VersionData{
major: 0,
minor: 0,
patch: 0,
}
}