github.com/johnnyeven/libtools@v0.0.0-20191126065708-61829c1adf46/servicex/internal/version.go (about) 1 package internal 2 3 import ( 4 "errors" 5 "regexp" 6 "strconv" 7 "strings" 8 ) 9 10 var VersionRegexp = regexp.MustCompile("(\\d+)\\.(\\d+)\\.(\\d+)") 11 12 func FromVersionString(s string) (*Version, error) { 13 versions := VersionRegexp.FindAllStringSubmatch(s, -1) 14 15 if len(versions) == 0 || len(versions[0]) != 4 { 16 return nil, errors.New(s + " is not an available version") 17 } 18 19 vs := versions[0] 20 21 major, _ := strconv.ParseInt(vs[1], 10, 10) 22 minor, _ := strconv.ParseInt(vs[2], 10, 10) 23 patch, _ := strconv.ParseInt(vs[3], 10, 10) 24 25 return &Version{ 26 Major: int(major), 27 Minor: int(minor), 28 Patch: int(patch), 29 }, nil 30 } 31 32 type Version struct { 33 Latest bool 34 Suffix string 35 Prefix string 36 Major int 37 Minor int 38 Patch int 39 } 40 41 func (v Version) IsStable() bool { 42 return !(v.Latest || v.Suffix != "") 43 } 44 45 func (v Version) String() string { 46 version := "latest" 47 if !v.Latest { 48 versions := []string{ 49 strconv.Itoa(v.Major), 50 strconv.Itoa(v.Minor), 51 strconv.Itoa(v.Patch), 52 } 53 version = strings.Join(versions, ".") 54 } 55 56 if v.Prefix != "" { 57 version = v.Prefix + "-" + version 58 } 59 60 if v.Suffix != "" { 61 version = version + "-" + v.Suffix 62 } 63 64 return strings.ToLower(version) 65 } 66 67 func (v Version) IncreaseMajor() Version { 68 v.Major = v.Major + 1 69 v.Minor = 0 70 v.Patch = 0 71 return v 72 } 73 74 func (v Version) IncreaseMinor() Version { 75 v.Minor = v.Minor + 1 76 v.Patch = 0 77 return v 78 } 79 80 func (v Version) IncreasePatch() Version { 81 v.Patch = v.Patch + 1 82 return v 83 } 84 85 func (v Version) MarshalYAML() (interface{}, error) { 86 return v.String(), nil 87 } 88 89 func (v *Version) UnmarshalYAML(unmarshal func(interface{}) error) error { 90 var value string 91 err := unmarshal(&value) 92 if err != nil { 93 return err 94 } 95 if version, err := FromVersionString(value); err == nil { 96 v.Major = version.Major 97 v.Minor = version.Minor 98 v.Patch = version.Patch 99 return nil 100 } else { 101 return err 102 } 103 return nil 104 }