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 }