github.com/ava-labs/avalanchego@v1.11.11/version/parser.go (about)

     1  // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package version
     5  
     6  import (
     7  	"errors"
     8  	"fmt"
     9  	"strconv"
    10  	"strings"
    11  )
    12  
    13  var (
    14  	errMissingVersionPrefix = errors.New("missing required version prefix")
    15  	errMissingVersions      = errors.New("missing version numbers")
    16  )
    17  
    18  func Parse(s string) (*Semantic, error) {
    19  	if !strings.HasPrefix(s, "v") {
    20  		return nil, fmt.Errorf("%w: %q", errMissingVersionPrefix, s)
    21  	}
    22  
    23  	s = s[1:]
    24  	major, minor, patch, err := parseVersions(s)
    25  	if err != nil {
    26  		return nil, err
    27  	}
    28  
    29  	return &Semantic{
    30  		Major: major,
    31  		Minor: minor,
    32  		Patch: patch,
    33  	}, nil
    34  }
    35  
    36  func parseVersions(s string) (int, int, int, error) {
    37  	splitVersion := strings.SplitN(s, ".", 3)
    38  	if numSeperators := len(splitVersion); numSeperators != 3 {
    39  		return 0, 0, 0, fmt.Errorf("%w: expected 3 only got %d", errMissingVersions, numSeperators)
    40  	}
    41  
    42  	major, err := strconv.Atoi(splitVersion[0])
    43  	if err != nil {
    44  		return 0, 0, 0, fmt.Errorf("failed to parse %s as a version: %w", s, err)
    45  	}
    46  
    47  	minor, err := strconv.Atoi(splitVersion[1])
    48  	if err != nil {
    49  		return 0, 0, 0, fmt.Errorf("failed to parse %s as a version: %w", s, err)
    50  	}
    51  
    52  	patch, err := strconv.Atoi(splitVersion[2])
    53  	if err != nil {
    54  		return 0, 0, 0, fmt.Errorf("failed to parse %s as a version: %w", s, err)
    55  	}
    56  
    57  	return major, minor, patch, nil
    58  }