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  }