Version.kt 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package com.sirekanyan.bump.model
  2. fun String.toVersion(): Version? {
  3. fun Regex.groupValues() = matchEntire(this@toVersion)?.groupValues
  4. fun List<String>.getInt(index: Int) = this[index].toInt()
  5. Regex("^(\\d+)$").groupValues()?.run {
  6. return Version(getInt(1))
  7. }
  8. Regex("^(\\d+)\\.(\\d+)$").groupValues()?.run {
  9. return Version(getInt(1), getInt(2))
  10. }
  11. Regex("^(\\d+)\\.(\\d+)\\.(\\d+)$").groupValues()?.run {
  12. return Version(getInt(1), getInt(2), getInt(3))
  13. }
  14. Regex("^(\\d+)\\.(\\d+)\\.(\\d+)-(\\d+)$").groupValues()?.run {
  15. return Version(getInt(1), getInt(2), getInt(3), getInt(4))
  16. }
  17. return null
  18. }
  19. data class Version(
  20. val major: Int,
  21. val minor: Int? = null,
  22. val patch: Int? = null,
  23. val fix: Int? = null,
  24. ) : Comparable<Version> {
  25. private val comparator: Comparator<Version> =
  26. compareBy<Version> { it.major }
  27. .thenBy { it.minor ?: 0 }
  28. .thenBy { it.patch ?: 0 }
  29. .thenBy { it.fix ?: 0 }
  30. override fun compareTo(other: Version): Int =
  31. comparator.compare(this, other)
  32. override fun toString(): String =
  33. when {
  34. fix == null && patch == null && minor == null -> "$major"
  35. fix == null && patch == null -> "$major.$minor"
  36. fix == null -> "$major.$minor.$patch"
  37. else -> "$major.$minor.$patch-$fix"
  38. }
  39. companion object {
  40. val ZERO = Version(0)
  41. }
  42. }