mirror of https://github.com/poanetwork/gecko.git
143 lines
2.2 KiB
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
|
|
}
|