Stable APIs for Go. https://go.code.as
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

89 lines
1.7 KiB

  1. package main
  2. import (
  3. "fmt"
  4. "strconv"
  5. "strings"
  6. )
  7. type Version struct {
  8. Major, Minor, Patch int
  9. }
  10. func (v Version) String() string {
  11. if v.Major < 0 {
  12. panic(fmt.Sprintf("cannot stringify invalid version (major is %d)", v.Major))
  13. }
  14. if v.Minor < 0 {
  15. return fmt.Sprintf("v%d", v.Major)
  16. }
  17. if v.Patch < 0 {
  18. return fmt.Sprintf("v%d.%d", v.Major, v.Minor)
  19. }
  20. return fmt.Sprintf("v%d.%d.%d", v.Major, v.Minor, v.Patch)
  21. }
  22. func (v Version) Less(other Version) bool {
  23. if v.Major != other.Major {
  24. return v.Major < other.Major
  25. }
  26. if v.Minor != other.Minor {
  27. return v.Minor < other.Minor
  28. }
  29. return v.Patch < other.Patch
  30. }
  31. func (v Version) Contains(other Version) bool {
  32. if v.Patch != -1 {
  33. return v == other
  34. }
  35. if v.Minor != -1 {
  36. return v.Major == other.Major && v.Minor == other.Minor
  37. }
  38. return v.Major == other.Major
  39. }
  40. func (v Version) IsValid() bool {
  41. return v == InvalidVersion
  42. }
  43. var InvalidVersion = Version{-1, -1, -1}
  44. var TooHighVersion = Version{-2, -2, -2}
  45. func parseVersion(s string) (Version, bool) {
  46. if len(s) < 2 {
  47. return InvalidVersion, false
  48. }
  49. if s[0] != 'v' {
  50. return InvalidVersion, false
  51. }
  52. v := Version{-1, -1, -1}
  53. parts := strings.Split(s[1:], ".")
  54. if len(parts) == 0 || len(parts) > 3 {
  55. return InvalidVersion, false
  56. }
  57. for i, part := range parts {
  58. if len(part) == 0 || part[0] == '0' {
  59. return InvalidVersion, false
  60. }
  61. num, err := strconv.ParseInt(part, 10, 32)
  62. if err != nil {
  63. if err.(*strconv.NumError).Err == strconv.ErrRange {
  64. return TooHighVersion, false
  65. }
  66. return InvalidVersion, false
  67. }
  68. switch i {
  69. case 0:
  70. v.Major = int(num)
  71. case 1:
  72. v.Minor = int(num)
  73. case 2:
  74. v.Patch = int(num)
  75. }
  76. }
  77. return v, true
  78. }