diff options
Diffstat (limited to 'client/go/version/version.go')
-rw-r--r-- | client/go/version/version.go | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/client/go/version/version.go b/client/go/version/version.go new file mode 100644 index 00000000000..e0dc8bf39ae --- /dev/null +++ b/client/go/version/version.go @@ -0,0 +1,61 @@ +package version + +import ( + "fmt" + "strconv" + "strings" +) + +// Version represents a semantic version number. +type Version struct { + Major int + Minor int + Patch int +} + +func (v Version) String() string { return fmt.Sprintf("%d.%d.%d", v.Major, v.Minor, v.Patch) } + +// Compare returns a positive integer if v1 is greater than v2, a negative integer if v1 is less than v2 and zero if they +// are equal. +func (v1 Version) Compare(v2 Version) int { + result := v1.Major - v2.Major + if result != 0 { + return result + } + result = v1.Minor - v2.Minor + if result != 0 { + return result + } + result = v1.Patch - v2.Patch + if result != 0 { + return result + } + return 0 +} + +// Less returns true if v1 is lower than v2. +func (v1 Version) Less(v2 Version) bool { return v1.Compare(v2) < 0 } + +// Parse parses a semantic version number from string s. +func Parse(s string) (Version, error) { + if len(s) > 0 && s[0] == 'v' { + s = s[1:] // Trim v prefix + } + parts := strings.Split(s, ".") + if len(parts) != 3 { + return Version{}, fmt.Errorf("invalid version number: %s", s) + } + major, err := strconv.Atoi(parts[0]) + if err != nil { + return Version{}, fmt.Errorf("invalid major version: %s", parts[0]) + } + minor, err := strconv.Atoi(parts[1]) + if err != nil { + return Version{}, fmt.Errorf("invalid minor version: %s", parts[1]) + } + patch, err := strconv.Atoi(parts[2]) + if err != nil { + return Version{}, fmt.Errorf("invalid patch version: %s", parts[2]) + } + return Version{Major: major, Minor: minor, Patch: patch}, nil +} |