k8c.io/api/v3@v3.0.0-20230904060738-b0a93889c0b6/pkg/semver/semver.go (about) 1 /* 2 Copyright 2023 The Kubermatic Kubernetes Platform contributors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package semver 18 19 import ( 20 "flag" 21 "fmt" 22 23 semverlib "github.com/Masterminds/semver/v3" 24 ) 25 26 var ( 27 _ flag.Value = new(Semver) 28 ) 29 30 // Semver is a type that encapsulates github.com/Masterminds/semver/v3.Version struct so it can be used in our API. 31 type Semver string 32 33 // NewSemver creates new Semver version struct and returns pointer to it. 34 func NewSemver(ver string) (*Semver, error) { 35 v := new(Semver) 36 if err := v.Set(ver); err != nil { 37 return nil, err 38 } 39 40 return v, nil 41 } 42 43 // NewSemverOrDie behaves similar to NewVersion, i.e. it creates new Semver version struct, but panics if an error happens. 44 func NewSemverOrDie(ver string) *Semver { 45 sv, err := NewSemver(ver) 46 if err != nil { 47 panic(err) 48 } 49 50 return sv 51 } 52 53 // Set initializes semver struct and sets version. 54 func (s *Semver) Set(ver string) error { 55 if _, err := semverlib.NewVersion(ver); err != nil { 56 return err 57 } 58 *s = Semver(ver) 59 60 return nil 61 } 62 63 // Semver returns github.com/Masterminds/semver/v3 struct. 64 // In case when Semver is nil, nil will be returned. 65 // In case of parsing error, nil will be returned. 66 func (s *Semver) Semver() *semverlib.Version { 67 if s == nil { 68 return nil 69 } 70 71 sver, err := semverlib.NewVersion(string(*s)) 72 if err != nil { 73 return nil 74 } 75 76 return sver 77 } 78 79 // Equal compares two version structs by comparing Semver values. 80 func (s *Semver) Equal(b *Semver) bool { 81 if s == nil || b == nil { 82 return false 83 } 84 85 sver, bver := s.Semver(), b.Semver() 86 if sver == nil || bver == nil { 87 return false 88 } 89 90 return sver.Equal(bver) 91 } 92 93 func (s *Semver) LessThan(b *Semver) bool { 94 if s == nil || b == nil { 95 return false 96 } 97 98 sver, bver := s.Semver(), b.Semver() 99 if sver == nil || bver == nil { 100 return false 101 } 102 103 return sver.LessThan(bver) 104 } 105 106 func (s *Semver) GreaterThan(b *Semver) bool { 107 if s == nil || b == nil { 108 return false 109 } 110 111 sver, bver := s.Semver(), b.Semver() 112 if sver == nil || bver == nil { 113 return false 114 } 115 116 return sver.GreaterThan(bver) 117 } 118 119 // String returns string representation of Semver version. 120 func (s *Semver) String() string { 121 sver := s.Semver() 122 if sver == nil { 123 return "" 124 } 125 126 return sver.String() 127 } 128 129 // MajorMinor returns a string like "Major.Minor". 130 func (s *Semver) MajorMinor() string { 131 sver := s.Semver() 132 if sver == nil { 133 return "" 134 } 135 136 return fmt.Sprintf("%d.%d", sver.Major(), sver.Minor()) 137 } 138 139 func (s Semver) DeepCopy() Semver { 140 if s.Semver() == nil { 141 return "" 142 } 143 144 return *NewSemverOrDie(s.String()) 145 } 146 147 func (in *Semver) DeepCopyInto(out *Semver) { 148 *out = in.DeepCopy() 149 }