gecko/version/version.go

143 lines
2.2 KiB
Go

// (c) 2019-2020, Ava Labs, Inc. All rights reserved.
// See the file LICENSE for licensing terms.
package version
import (
"errors"
"fmt"
)
const (
defaultAppSeparator = "/"
defaultVersionSeparator = "."
)
var (
errDifferentApps = errors.New("different applications")
errDifferentMajor = errors.New("different major version")
errDifferentMinor = errors.New("different minor version")
)
// Version defines what is needed to describe a version
type Version interface {
fmt.Stringer
App() string
Major() int
Minor() int
Patch() int
Compatible(Version) error
Before(Version) bool
}
type version struct {
app string
major int
minor int
patch int
str string
}
// NewDefaultVersion returns a new version with default separators
func NewDefaultVersion(
app string,
major int,
minor int,
patch int,
) Version {
return NewVersion(
app,
defaultAppSeparator,
defaultVersionSeparator,
major,
minor,
patch,
)
}
// NewVersion returns a new version
func NewVersion(
app string,
appSeparator string,
versionSeparator string,
major int,
minor int,
patch int,
) Version {
return &version{
app: app,
major: major,
minor: minor,
patch: patch,
str: fmt.Sprintf("%s%s%d%s%d%s%d",
app,
appSeparator,
major,
versionSeparator,
minor,
versionSeparator,
patch,
),
}
}
func (v *version) App() string { return v.app }
func (v *version) Major() int { return v.major }
func (v *version) Minor() int { return v.minor }
func (v *version) Patch() int { return v.patch }
func (v *version) String() string { return v.str }
func (v *version) Compatible(o Version) error {
switch {
case v.App() != o.App():
return errDifferentApps
case v.Major() != o.Major():
return errDifferentMajor
case v.Minor() != o.Minor():
return errDifferentMinor
default:
return nil
}
}
func (v *version) Before(o Version) bool {
if v.App() != o.App() {
return false
}
{
v := v.Major()
o := o.Major()
switch {
case v < o:
return true
case v > o:
return false
}
}
{
v := v.Minor()
o := o.Minor()
switch {
case v < o:
return true
case v > o:
return false
}
}
{
v := v.Patch()
o := o.Patch()
switch {
case v < o:
return true
}
}
return false
}