Stable APIs for Go. https://go.code.as
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

85 строки
1.5 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. func parseVersion(s string) (Version, bool) {
  45. if len(s) < 2 {
  46. return InvalidVersion, false
  47. }
  48. if s[0] != 'v' {
  49. return InvalidVersion, false
  50. }
  51. v := Version{-1, -1, -1}
  52. parts := strings.Split(s[1:], ".")
  53. if len(parts) == 0 || len(parts) > 3 {
  54. return InvalidVersion, false
  55. }
  56. for i, part := range parts {
  57. if len(part) == 0 || part[0] == '0' {
  58. return InvalidVersion, false
  59. }
  60. num, err := strconv.Atoi(part)
  61. if err != nil {
  62. return InvalidVersion, false
  63. }
  64. switch i {
  65. case 0:
  66. v.Major = num
  67. case 1:
  68. v.Minor = num
  69. case 2:
  70. v.Patch = num
  71. }
  72. }
  73. return v, true
  74. }