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  }