package gs import scala.util.matching.Regex case class SemVer( major: Int, minor: Int, patch: Int ) { override def toString(): String = s"$major.$minor.$patch" def incrementPatch(): SemVer = copy(patch = this.patch + 1) } object SemVer { val SemVerPattern: Regex = "^(0|(?:[1-9][0-9]*))\\.(0|(?:[1-9][0-9]*))\\.(0|(?:[1-9][0-9]*))$".r def parse(candidate: String): Option[SemVer] = candidate match { case SemVerPattern(major, minor, patch) => Some(SemVer(major.toInt, minor.toInt, patch.toInt)) case _ => None } }