package game import ( "strconv" "strings" ) // compareDictVersions orders two dictionary version labels of the shape "vMAJOR.MINOR.PATCH" // numerically, returning -1, 0 or +1 as a is less than, equal to or greater than b. Labels // that do not parse fall back to a byte comparison, so the ordering is always total (a mixed // or malformed pair never crashes the boot-time active-version reconcile). func compareDictVersions(a, b string) int { pa, oka := parseDictVersion(a) pb, okb := parseDictVersion(b) if !oka || !okb { return strings.Compare(a, b) } for i := range pa { if pa[i] != pb[i] { if pa[i] < pb[i] { return -1 } return 1 } } return 0 } // parseDictVersion parses a "vMAJOR.MINOR.PATCH" label into its three numeric parts, reporting // whether it matched that shape. func parseDictVersion(v string) ([3]int, bool) { parts := strings.Split(strings.TrimPrefix(v, "v"), ".") if len(parts) != 3 { return [3]int{}, false } var out [3]int for i, p := range parts { n, err := strconv.Atoi(p) if err != nil { return [3]int{}, false } out[i] = n } return out, true }