summaryrefslogtreecommitdiff
path: root/scalalib/src/mill/scalalib/dependency/versions/VersionParser.scala
blob: d85c4276d2e8b2ad15da1a43dc82074f37962aa6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package mill.scalalib.dependency.versions

import fastparse.all._

private[dependency] object VersionParser {

  private val numberParser =
    P(CharIn('0' to '9').rep(1).!.map(_.toLong))
  private val numericPartParser =
    P(numberParser ~ &(CharIn(".", "-", "+") | End)).rep(min = 1, sep = ".")

  private val tokenParser =
    CharPred(c => c != '.' && c != '-' && c != '+').rep(1).!
  private val tokenPartParser =
    tokenParser.rep(sep = CharIn(".", "-"))

  private val firstPartParser =
    P(CharIn(".", "-") ~ tokenPartParser).?

  private val secondPartParser =
    P("+" ~ tokenPartParser).?

  private val versionParser =
    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])] =
    versionParser.parse(text)
}