github.com/ydb-platform/ydb-go-sdk/v3@v3.89.2/internal/version/parse.go (about)

     1  package version
     2  
     3  import (
     4  	"strconv"
     5  	"strings"
     6  
     7  	"github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors"
     8  )
     9  
    10  type version struct {
    11  	Major  uint64
    12  	Minor  uint64
    13  	Patch  uint64
    14  	Suffix string
    15  }
    16  
    17  func (lhs version) Less(rhs version) bool {
    18  	if lhs.Major < rhs.Major {
    19  		return true
    20  	}
    21  	if lhs.Major > rhs.Major {
    22  		return false
    23  	}
    24  	if lhs.Minor < rhs.Minor {
    25  		return true
    26  	}
    27  	if lhs.Minor > rhs.Minor {
    28  		return false
    29  	}
    30  	if lhs.Patch < rhs.Patch {
    31  		return true
    32  	}
    33  	if lhs.Patch > rhs.Patch {
    34  		return false
    35  	}
    36  
    37  	return lhs.Suffix < rhs.Suffix
    38  }
    39  
    40  // Lt compare lhs and rhs as (lhs < rhs)
    41  func Lt(lhs, rhs string) bool {
    42  	v1, err := parse(lhs)
    43  	if err != nil {
    44  		return false
    45  	}
    46  	v2, err := parse(rhs)
    47  	if err != nil {
    48  		return false
    49  	}
    50  
    51  	return v1.Less(v2)
    52  }
    53  
    54  // Gte compare lhs and rhs as (lhs >= rhs)
    55  func Gte(lhs, rhs string) bool {
    56  	v1, err := parse(lhs)
    57  	if err != nil {
    58  		return false
    59  	}
    60  	v2, err := parse(rhs)
    61  	if err != nil {
    62  		return false
    63  	}
    64  	if v1.Less(v2) {
    65  		return false
    66  	}
    67  
    68  	return true
    69  }
    70  
    71  //nolint:gomnd
    72  func parse(s string) (v version, err error) {
    73  	ss := strings.SplitN(s, "-", 2)
    74  	if len(ss) == 2 {
    75  		v.Suffix = ss[1]
    76  	}
    77  	sss := strings.SplitN(ss[0], ".", 3)
    78  	if len(sss) == 3 {
    79  		v.Patch, err = strconv.ParseUint(sss[2], 10, 64)
    80  		if err != nil {
    81  			return version{}, xerrors.WithStackTrace(err)
    82  		}
    83  	}
    84  	if len(sss) >= 2 {
    85  		v.Minor, err = strconv.ParseUint(sss[1], 10, 64)
    86  		if err != nil {
    87  			return version{}, xerrors.WithStackTrace(err)
    88  		}
    89  	}
    90  	if len(sss) >= 1 {
    91  		v.Major, err = strconv.ParseUint(sss[0], 10, 64)
    92  		if err != nil {
    93  			return version{}, xerrors.WithStackTrace(err)
    94  		}
    95  	}
    96  
    97  	return v, nil
    98  }