summaryrefslogtreecommitdiff
path: root/scalalib/src/dependency/versions/VersionParser.scala
diff options
context:
space:
mode:
Diffstat (limited to 'scalalib/src/dependency/versions/VersionParser.scala')
-rw-r--r--scalalib/src/dependency/versions/VersionParser.scala30
1 files changed, 30 insertions, 0 deletions
diff --git a/scalalib/src/dependency/versions/VersionParser.scala b/scalalib/src/dependency/versions/VersionParser.scala
new file mode 100644
index 00000000..10aebd73
--- /dev/null
+++ b/scalalib/src/dependency/versions/VersionParser.scala
@@ -0,0 +1,30 @@
+package mill.scalalib.dependency.versions
+
+import fastparse._, NoWhitespace._
+
+private[dependency] object VersionParser {
+
+ private def numberParser[_: P] =
+ P(CharIn("0-9").rep(1).!.map(_.toLong))
+ private def numericPartParser[_: P] =
+ P(numberParser ~ &(CharIn(".\\-+") | End)).rep(min = 1, sep = ".")
+
+ private def tokenParser[_: P] =
+ CharPred(c => c != '.' && c != '-' && c != '+').rep(1).!
+ private def tokenPartParser[_: P] =
+ tokenParser.rep(sep = CharIn(".\\-"))
+
+ private def firstPartParser[_: P] =
+ P(CharIn(".\\-") ~ tokenPartParser).?
+
+ private def secondPartParser[_: P] =
+ P("+" ~ tokenPartParser).?
+
+ private def versionParser[_: P] =
+ P(numericPartParser ~ firstPartParser ~ secondPartParser).map {
+ case (a, b, c) => (a, b.getOrElse(Seq.empty), c.getOrElse(Seq.empty))
+ }
+
+ def parse(text: String): Parsed[(Seq[Long], Seq[String], Seq[String])] =
+ fastparse.parse(text, versionParser(_))
+}