github.com/johnnyeven/libtools@v0.0.0-20191126065708-61829c1adf46/servicex/internal/version.go (about)

     1  package internal
     2  
     3  import (
     4  	"errors"
     5  	"regexp"
     6  	"strconv"
     7  	"strings"
     8  )
     9  
    10  var VersionRegexp = regexp.MustCompile("(\\d+)\\.(\\d+)\\.(\\d+)")
    11  
    12  func FromVersionString(s string) (*Version, error) {
    13  	versions := VersionRegexp.FindAllStringSubmatch(s, -1)
    14  
    15  	if len(versions) == 0 || len(versions[0]) != 4 {
    16  		return nil, errors.New(s + " is not an available version")
    17  	}
    18  
    19  	vs := versions[0]
    20  
    21  	major, _ := strconv.ParseInt(vs[1], 10, 10)
    22  	minor, _ := strconv.ParseInt(vs[2], 10, 10)
    23  	patch, _ := strconv.ParseInt(vs[3], 10, 10)
    24  
    25  	return &Version{
    26  		Major: int(major),
    27  		Minor: int(minor),
    28  		Patch: int(patch),
    29  	}, nil
    30  }
    31  
    32  type Version struct {
    33  	Latest bool
    34  	Suffix string
    35  	Prefix string
    36  	Major  int
    37  	Minor  int
    38  	Patch  int
    39  }
    40  
    41  func (v Version) IsStable() bool {
    42  	return !(v.Latest || v.Suffix != "")
    43  }
    44  
    45  func (v Version) String() string {
    46  	version := "latest"
    47  	if !v.Latest {
    48  		versions := []string{
    49  			strconv.Itoa(v.Major),
    50  			strconv.Itoa(v.Minor),
    51  			strconv.Itoa(v.Patch),
    52  		}
    53  		version = strings.Join(versions, ".")
    54  	}
    55  
    56  	if v.Prefix != "" {
    57  		version = v.Prefix + "-" + version
    58  	}
    59  
    60  	if v.Suffix != "" {
    61  		version = version + "-" + v.Suffix
    62  	}
    63  
    64  	return strings.ToLower(version)
    65  }
    66  
    67  func (v Version) IncreaseMajor() Version {
    68  	v.Major = v.Major + 1
    69  	v.Minor = 0
    70  	v.Patch = 0
    71  	return v
    72  }
    73  
    74  func (v Version) IncreaseMinor() Version {
    75  	v.Minor = v.Minor + 1
    76  	v.Patch = 0
    77  	return v
    78  }
    79  
    80  func (v Version) IncreasePatch() Version {
    81  	v.Patch = v.Patch + 1
    82  	return v
    83  }
    84  
    85  func (v Version) MarshalYAML() (interface{}, error) {
    86  	return v.String(), nil
    87  }
    88  
    89  func (v *Version) UnmarshalYAML(unmarshal func(interface{}) error) error {
    90  	var value string
    91  	err := unmarshal(&value)
    92  	if err != nil {
    93  		return err
    94  	}
    95  	if version, err := FromVersionString(value); err == nil {
    96  		v.Major = version.Major
    97  		v.Minor = version.Minor
    98  		v.Patch = version.Patch
    99  		return nil
   100  	} else {
   101  		return err
   102  	}
   103  	return nil
   104  }