118 lines
2.6 KiB
Go
118 lines
2.6 KiB
Go
package version
|
|
|
|
import (
|
|
"fmt"
|
|
)
|
|
|
|
// Version is a structured representation of a version number.
|
|
type Version struct {
|
|
Major int // Major version number.
|
|
Minor int // Minor version number.
|
|
Patch int // Patch version number.
|
|
Extension string // Version extension, such as pre-release number or build metdata.
|
|
|
|
Text string // Original version string, if this version was created via the Parse function.
|
|
}
|
|
|
|
// Compare this version (a) with another version (b).
|
|
// This function returns -1 if a is less than b, 1 if a is greater than b, or 0 if a is equal to b.
|
|
//
|
|
// Extensions such as pre-release version or build metadata are ignored when comparing versions.
|
|
func (a *Version) Compare(b *Version) int {
|
|
if a == nil && b != nil {
|
|
return -1
|
|
} else if a != nil && b == nil {
|
|
return 1
|
|
} else if a == nil && b == nil {
|
|
return 0
|
|
}
|
|
|
|
if a.Major == b.Major {
|
|
if a.Minor == b.Minor {
|
|
if a.Patch == b.Patch {
|
|
return 0
|
|
} else if a.Patch > b.Patch {
|
|
return 1
|
|
}
|
|
} else if a.Minor > b.Minor {
|
|
return 1
|
|
}
|
|
} else if a.Major > b.Major {
|
|
return 1
|
|
}
|
|
|
|
return -1
|
|
}
|
|
|
|
// Equal checks for equality between two versions.
|
|
//
|
|
// Extensions such as pre-release version or build metadata are ignored when comparing versions.
|
|
func (a *Version) Equal(b *Version) bool {
|
|
return a.Compare(b) == 0
|
|
}
|
|
|
|
// Match tests the version against a constraint.
|
|
// Gt and Lt take precedence over Gte and Lte.
|
|
func (v *Version) Match(c *Constraint) bool {
|
|
if v == nil {
|
|
return false
|
|
}
|
|
|
|
if c == nil {
|
|
return true
|
|
}
|
|
|
|
if c.Gt != nil {
|
|
if v.Compare(c.Gt) <= 0 {
|
|
return false
|
|
}
|
|
} else if c.Gte != nil {
|
|
if v.Compare(c.Gte) < 0 {
|
|
return false
|
|
}
|
|
}
|
|
|
|
if c.Lt != nil {
|
|
if v.Compare(c.Lt) >= 0 {
|
|
return false
|
|
}
|
|
} else if c.Lte != nil {
|
|
if v.Compare(c.Lte) > 0 {
|
|
return false
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
// Less performs a simple comparison of this version (a) with another version (b).
|
|
// This function returns true if a is less than b, or false otherwise.
|
|
//
|
|
// Extensions such as pre-release version or build metadata are ignored when comparing versions.
|
|
func (a *Version) Less(b *Version) bool {
|
|
return a.Compare(b) < 0
|
|
}
|
|
|
|
// SemanticString returns a version string conforming to the standard described in Semantic Versioning 2.0.0.
|
|
//
|
|
// See https://semver.org/#is-v123-a-semantic-version
|
|
func (v *Version) SemanticString() string {
|
|
if v == nil {
|
|
return ""
|
|
}
|
|
|
|
return fmt.Sprintf("%d.%d.%d%s", v.Major, v.Minor, v.Patch, v.Extension)
|
|
}
|
|
|
|
func (v *Version) String() string {
|
|
if v == nil {
|
|
return ""
|
|
}
|
|
|
|
if v.Text != "" {
|
|
return v.Text
|
|
}
|
|
|
|
return v.SemanticString()
|
|
}
|