github.com/wikibal01/hashicorp-terraform@v0.11.12-beta1/plugin/discovery/version.go (about) 1 package discovery 2 3 import ( 4 "fmt" 5 "sort" 6 7 version "github.com/hashicorp/go-version" 8 ) 9 10 const VersionZero = "0.0.0" 11 12 // A VersionStr is a string containing a possibly-invalid representation 13 // of a semver version number. Call Parse on it to obtain a real Version 14 // object, or discover that it is invalid. 15 type VersionStr string 16 17 // Parse transforms a VersionStr into a Version if it is 18 // syntactically valid. If it isn't then an error is returned instead. 19 func (s VersionStr) Parse() (Version, error) { 20 raw, err := version.NewVersion(string(s)) 21 if err != nil { 22 return Version{}, err 23 } 24 return Version{raw}, nil 25 } 26 27 // MustParse transforms a VersionStr into a Version if it is 28 // syntactically valid. If it isn't then it panics. 29 func (s VersionStr) MustParse() Version { 30 ret, err := s.Parse() 31 if err != nil { 32 panic(err) 33 } 34 return ret 35 } 36 37 // Version represents a version number that has been parsed from 38 // a semver string and known to be valid. 39 type Version struct { 40 // We wrap this here just because it avoids a proliferation of 41 // direct go-version imports all over the place, and keeps the 42 // version-processing details within this package. 43 raw *version.Version 44 } 45 46 func (v Version) String() string { 47 return v.raw.String() 48 } 49 50 func (v Version) NewerThan(other Version) bool { 51 return v.raw.GreaterThan(other.raw) 52 } 53 54 func (v Version) Equal(other Version) bool { 55 return v.raw.Equal(other.raw) 56 } 57 58 // MinorUpgradeConstraintStr returns a ConstraintStr that would permit 59 // minor upgrades relative to the receiving version. 60 func (v Version) MinorUpgradeConstraintStr() ConstraintStr { 61 segments := v.raw.Segments() 62 return ConstraintStr(fmt.Sprintf("~> %d.%d", segments[0], segments[1])) 63 } 64 65 type Versions []Version 66 67 // Sort sorts version from newest to oldest. 68 func (v Versions) Sort() { 69 sort.Slice(v, func(i, j int) bool { 70 return v[i].NewerThan(v[j]) 71 }) 72 }