github.com/boki/go-xmp@v1.0.1/xmp/semver.go (about) 1 // Copyright (c) 2017-2018 Alexander Eichhorn 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"): you may 4 // not use this file except in compliance with the License. You may obtain 5 // a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12 // License for the specific language governing permissions and limitations 13 // under the License. 14 15 package xmp 16 17 import ( 18 "fmt" 19 "strconv" 20 "strings" 21 ) 22 23 type Version struct { 24 Major int 25 Minor int 26 Patch int 27 } 28 29 func ParseVersion(s string) (Version, error) { 30 var v Version 31 tokens := strings.Split(s, ".") 32 switch len(tokens) { 33 case 3: 34 i, err := strconv.Atoi(tokens[2]) 35 if err != nil { 36 return v, fmt.Errorf("semver: illegal version string '%s': %v", s, err) 37 } 38 v.Patch = i 39 fallthrough 40 case 2: 41 i, err := strconv.Atoi(tokens[1]) 42 if err != nil { 43 return v, fmt.Errorf("semver: illegal version string '%s': %v", s, err) 44 } 45 v.Minor = i 46 fallthrough 47 case 1: 48 i, err := strconv.Atoi(tokens[0]) 49 if err != nil { 50 return v, fmt.Errorf("semver: illegal version string '%s': %v", s, err) 51 } 52 v.Major = i 53 default: 54 return v, fmt.Errorf("semver: illegal version string '%s'", s) 55 } 56 return v, nil 57 } 58 59 func (v Version) String() string { 60 return fmt.Sprintf("%d.%d.%d", v.Major, v.Minor, v.Patch) 61 } 62 63 func (v Version) IsZero() bool { 64 return v.Major+v.Minor+v.Patch == 0 65 } 66 67 func (v Version) Between(a, b Version) bool { 68 switch { 69 case v.IsZero(): 70 return true 71 case a.IsZero(): 72 return v.Before(b) || v.Equal(a) 73 case b.IsZero(): 74 return v.After(a) || v.Equal(a) 75 default: 76 return v.Equal(a) || v.Equal(b) || (v.After(a) && v.Before(b)) 77 } 78 } 79 80 func (v Version) Equal(a Version) bool { 81 return v.Major == a.Major && v.Minor == a.Minor && v.Patch == a.Patch 82 } 83 84 func (v Version) Before(a Version) bool { 85 return (v.Major < a.Major) || 86 (v.Major == a.Major && v.Minor < a.Minor) || 87 (v.Major == a.Major && v.Minor == a.Minor && v.Patch < a.Patch) 88 } 89 90 func (v Version) After(a Version) bool { 91 return (v.Major > a.Major) || 92 (v.Major == a.Major && v.Minor > a.Minor) || 93 (v.Major == a.Major && v.Minor == a.Minor && v.Patch > a.Patch) 94 }