sbt/launch/LaunchConfiguration.scala

107 lines
4.8 KiB
Scala
Raw Normal View History

2009-09-26 08:18:04 +02:00
package xsbt.boot
2009-10-18 04:40:02 +02:00
import Pre._
2009-09-26 08:18:04 +02:00
import java.io.File
import java.net.URL
2009-09-26 08:18:04 +02:00
2009-10-18 04:40:02 +02:00
final case class LaunchConfiguration(scalaVersion: Version, app: Application, repositories: List[Repository], boot: BootSetup, logging: Logging, appProperties: List[AppProperty]) extends NotNull
2009-09-26 08:18:04 +02:00
{
def getScalaVersion = Version.get(scalaVersion)
2009-10-18 04:40:02 +02:00
def withScalaVersion(newScalaVersion: String) = LaunchConfiguration(new Version.Explicit(newScalaVersion), app, repositories, boot, logging, appProperties)
2009-10-15 02:53:15 +02:00
def withApp(app: Application) = LaunchConfiguration(scalaVersion, app, repositories, boot, logging, appProperties)
2009-10-18 04:40:02 +02:00
def withAppVersion(newAppVersion: String) = LaunchConfiguration(scalaVersion, app.withVersion(new Version.Explicit(newAppVersion)), repositories, boot, logging, appProperties)
def withVersions(newScalaVersion: String, newAppVersion: String) = LaunchConfiguration(new Version.Explicit(newScalaVersion), app.withVersion(new Version.Explicit(newAppVersion)), repositories, boot, logging, appProperties)
2009-10-15 02:53:15 +02:00
def map(f: File => File) = LaunchConfiguration(scalaVersion, app, repositories, boot.map(f), logging, appProperties)
2009-09-26 08:18:04 +02:00
}
sealed trait Version extends NotNull
object Version
{
2009-10-18 04:40:02 +02:00
final class Explicit(val value: String) extends Version
final class Implicit(val default: Option[String]) extends Version
2009-09-26 08:18:04 +02:00
{
2009-10-18 04:40:02 +02:00
require(default.isEmpty || isNonEmpty(default.get), "Default cannot be the empty string")
2009-09-26 08:18:04 +02:00
}
2009-10-15 02:53:15 +02:00
object Implicit
2009-09-26 08:18:04 +02:00
{
2009-10-18 04:40:02 +02:00
def apply(s: String, default: Option[String])(handleError: String => Version): Version =
if(s == "read") new Implicit(default) else handleError("Expected 'read', got '" + s +"'")
2009-09-26 08:18:04 +02:00
}
2009-10-18 04:40:02 +02:00
def get(v: Version) = v match { case e: Version.Explicit => e.value; case _ => throw new BootException("Unresolved version: " + v) }
def default = new Implicit(None)
2009-09-26 08:18:04 +02:00
}
2009-10-18 04:40:02 +02:00
final case class Application(groupID: String, name: String, version: Version, main: String, components: List[String], crossVersioned: Boolean) extends NotNull
2009-09-26 08:18:04 +02:00
{
def getVersion = Version.get(version)
def withVersion(newVersion: Version) = Application(groupID, name, newVersion, main, components, crossVersioned)
2009-10-18 04:40:02 +02:00
def toID = AppID(groupID, name, getVersion, main, toArray(components), crossVersioned)
2009-09-26 08:18:04 +02:00
}
final case class AppID(groupID: String, name: String, version: String, mainClass: String, mainComponents: Array[String], crossVersioned: Boolean) extends xsbti.ApplicationID
2009-09-26 08:18:04 +02:00
object Application
{
def apply(id: xsbti.ApplicationID): Application =
{
import id._
2009-10-18 04:40:02 +02:00
Application(groupID, name, new Version.Explicit(version), mainClass, mainComponents.toList, crossVersioned)
2009-09-26 08:18:04 +02:00
}
}
sealed trait Repository extends NotNull
object Repository
{
final case class Maven(id: String, url: URL) extends Repository
final case class Ivy(id: String, url: URL, pattern: String) extends Repository
2009-09-26 08:18:04 +02:00
final case class Predefined(id: Predefined.Value) extends Repository
2009-10-18 04:40:02 +02:00
object Predefined extends Enumeration
2009-09-26 08:18:04 +02:00
{
2009-10-18 04:40:02 +02:00
val Local = value("local")
val MavenLocal = value("maven-local")
val MavenCentral = value("maven-central")
val ScalaToolsReleases = value("scala-tools-releases")
val ScalaToolsSnapshots = value("scala-tools-snapshots")
def apply(s: String): Predefined = Predefined(toValue(s))
2009-09-26 08:18:04 +02:00
}
2009-10-18 04:40:02 +02:00
def defaults: List[Repository] = Predefined.elements.map(Predefined.apply).toList
2009-09-26 08:18:04 +02:00
}
2009-10-18 04:40:02 +02:00
final case class Search(tpe: Search.Value, paths: List[File]) extends NotNull
object Search extends Enumeration
{
def none = Search(Current, Nil)
2009-10-18 04:40:02 +02:00
val Only = value("only")
val RootFirst = value("root-first")
val Nearest = value("nearest")
val Current = value("none")
def apply(s: String, paths: List[File]): Search = Search(toValue(s), paths)
}
2009-10-15 02:53:15 +02:00
final case class BootSetup(directory: File, properties: File, search: Search, promptCreate: String, enableQuick: Boolean, promptFill: Boolean) extends NotNull
{
2009-10-15 02:53:15 +02:00
def map(f: File => File) = BootSetup(f(directory), f(properties), search, promptCreate, enableQuick, promptFill)
}
2009-10-15 02:53:15 +02:00
final case class AppProperty(name: String)(val quick: Option[PropertyInit], val create: Option[PropertyInit], val fill: Option[PropertyInit]) extends NotNull
sealed trait PropertyInit extends NotNull
2009-10-18 04:40:02 +02:00
final class SetProperty(val value: String) extends PropertyInit
final class PromptProperty(val label: String, val default: Option[String]) extends PropertyInit
2009-10-15 02:53:15 +02:00
2009-10-18 04:40:02 +02:00
final class Logging(level: LogLevel.Value) extends NotNull
object LogLevel extends Enumeration
2009-09-26 08:18:04 +02:00
{
2009-10-18 04:40:02 +02:00
val Debug = value("debug")
val Info = value("info")
val Warn = value("warn")
val Error = value("error")
def apply(s: String): Logging = new Logging(toValue(s))
2009-09-26 08:18:04 +02:00
}
final class AppConfiguration(val arguments: Array[String], val baseDirectory: File, val provider: xsbti.AppProvider) extends xsbti.AppConfiguration
2009-09-26 08:18:04 +02:00
// The exception to use when an error occurs at the launcher level (and not a nested exception).
// This indicates overrides toString because the exception class name is not needed to understand
// the error message.
2009-10-18 04:40:02 +02:00
class BootException(override val toString: String) extends RuntimeException