All Downloads are FREE. Search and download functionalities are using the official Maven repository.

coursier.parse.ModuleParser.scala Maven / Gradle / Ivy

package coursier.parse

import coursier.core.{Module, ModuleName, Organization}
import coursier.util.Traverse._
import coursier.util.ValidationNel

object ModuleParser {

  /**
    * Parses a module like
    *   org:name
    *  possibly with attributes, like
    *    org:name;attr1=val1;attr2=val2
    *
    * Two semi-columns after the org part is interpreted as a scala module. E.g. if
    * the scala version is 2.11., org::name is equivalent to org:name_2.11.
    */
  def javaOrScalaModule(s: String): Either[String, JavaOrScalaModule] = {

    val parts = s.split(":", -1)

    val values = parts match {
      case Array(org, rawName) =>
        Right((Organization(org), rawName, None))
      case Array(org, "", rawName) =>
        Right((Organization(org), rawName, Some(false)))
      case Array(org, "", "", rawName) =>
        Right((Organization(org), rawName, Some(true)))
      case _ =>
        Left(s"malformed module: $s")
    }

    values.flatMap {
      case (org, rawName, scalaFullVerOpt) =>

        val splitName = rawName.split(';')

        if (splitName.tail.exists(!_.contains("=")))
          Left(s"malformed attribute(s) in $s")
        else {
          val name = splitName.head
          val attributes = splitName.tail.map(_.split("=", 2)).map {
            case Array(key, value) => key -> value
          }.toMap

          val baseModule = Module(org, ModuleName(name), attributes)

          val module = scalaFullVerOpt match {
            case None =>
              JavaOrScalaModule.JavaModule(baseModule)
            case Some(scalaFullVer) =>
              JavaOrScalaModule.ScalaModule(baseModule, scalaFullVer)
          }

          Right(module)
        }
    }
  }

  /**
    * Parses a module like
    *   org:name
    *  possibly with attributes, like
    *    org:name;attr1=val1;attr2=val2
    *
    * Two semi-columns after the org part is interpreted as a scala module. E.g. if
    * `defaultScalaVersion` is `"2.11.x"`, org::name is equivalent to org:name_2.11.
    */
  def module(s: String, defaultScalaVersion: String): Either[String, Module] =
    javaOrScalaModule(s).map(_.module(defaultScalaVersion))


  def javaOrScalaModules(
    inputs: Seq[String]
  ): ValidationNel[String, Seq[JavaOrScalaModule]] =
    inputs.validationNelTraverse { input =>
      val e = javaOrScalaModule(input)
      ValidationNel.fromEither(e)
    }

  def modules(
    inputs: Seq[String],
    defaultScalaVersion: String
  ): ValidationNel[String, Seq[Module]] =
    javaOrScalaModules(inputs)
      .map(_.map(_.module(defaultScalaVersion)))

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy