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

scala.build.input.Element.scala Maven / Gradle / Ivy

package scala.build.input

import scala.build.preprocessing.ScopePath
import scala.util.matching.Regex

sealed abstract class Element extends Product with Serializable

sealed trait SingleElement extends Element

sealed trait AnyScript extends Element

sealed abstract class OnDisk extends Element {
  def path: os.Path
}

sealed abstract class Virtual extends SingleElement {
  def content: Array[Byte]

  def source: String

  def subPath: os.SubPath = {
    val idx = source.lastIndexOf('/')
    os.sub / source.drop(idx + 1)
  }

  def scopePath: ScopePath =
    ScopePath(Left(source), subPath)
}

object Virtual {
  val urlPathWithQueryParamsRegex = "https?://.*/([^/^?]+)(/?.*)?$".r
  def apply(path: String, content: Array[Byte]): Virtual = {
    val filename = path match {
      case urlPathWithQueryParamsRegex(name, _) => name
      case _                                    => path.split("/").last
    }

    val wrapperPath = os.sub / filename

    if filename.endsWith(".scala") then VirtualScalaFile(content, path)
    else if filename.endsWith(".java") then VirtualJavaFile(content, path)
    else if filename.endsWith(".sc") then VirtualScript(content, path, wrapperPath)
    else if filename.endsWith(".md") then VirtualMarkdownFile(content, path, wrapperPath)
    else VirtualData(content, path)
  }
}

sealed abstract class VirtualSourceFile extends Virtual {
  def isStdin: Boolean = source.startsWith("")

  def isSnippet: Boolean = source.startsWith("")

  protected def generatedSourceFileName(fileSuffix: String): String =
    if (isStdin) s"stdin$fileSuffix"
    else if (isSnippet) s"${source.stripPrefix("-")}$fileSuffix"
    else s"virtual$fileSuffix"
}

sealed trait SingleFile extends OnDisk with SingleElement

sealed trait SourceFile extends SingleFile {
  def subPath: os.SubPath
}

sealed trait Compiled extends Element

sealed trait AnyScalaFile    extends Compiled
sealed trait AnyJavaFile     extends Compiled
sealed trait AnyMarkdownFile extends Compiled

sealed trait ScalaFile extends AnyScalaFile {
  def base: os.Path

  def subPath: os.SubPath

  def path: os.Path = base / subPath
}

final case class Script(base: os.Path, subPath: os.SubPath, inputArg: Option[String])
    extends OnDisk with SourceFile with AnyScalaFile with AnyScript {
  lazy val path: os.Path = base / subPath
}

final case class SourceScalaFile(base: os.Path, subPath: os.SubPath)
    extends OnDisk with SourceFile with ScalaFile

final case class ProjectScalaFile(base: os.Path, subPath: os.SubPath)
    extends OnDisk with SourceFile with ScalaFile

final case class JavaFile(base: os.Path, subPath: os.SubPath)
    extends OnDisk with SourceFile with AnyJavaFile {
  lazy val path: os.Path = base / subPath
}

final case class JarFile(base: os.Path, subPath: os.SubPath)
    extends OnDisk with SourceFile {
  lazy val path: os.Path = base / subPath
}

final case class CFile(base: os.Path, subPath: os.SubPath)
    extends OnDisk with SourceFile with Compiled {
  lazy val path: os.Path = base / subPath
}

final case class MarkdownFile(base: os.Path, subPath: os.SubPath)
    extends OnDisk with SourceFile with AnyMarkdownFile {
  lazy val path: os.Path = base / subPath
}

final case class Directory(path: os.Path) extends OnDisk with Compiled

final case class ResourceDirectory(path: os.Path) extends OnDisk

final case class VirtualScript(content: Array[Byte], source: String, wrapperPath: os.SubPath)
    extends VirtualSourceFile with AnyScalaFile with AnyScript

object VirtualScript {
  val VirtualScriptNameRegex: Regex = "(^stdin$|^snippet\\d*$)".r
}

final case class VirtualScalaFile(content: Array[Byte], source: String)
    extends VirtualSourceFile with AnyScalaFile {
  def generatedSourceFileName: String = generatedSourceFileName(".scala")
}

final case class VirtualJavaFile(content: Array[Byte], source: String)
    extends VirtualSourceFile with AnyJavaFile {
  def generatedSourceFileName: String = generatedSourceFileName(".java")
}

final case class VirtualMarkdownFile(
  content: Array[Byte],
  override val source: String,
  wrapperPath: os.SubPath
) extends VirtualSourceFile with AnyMarkdownFile

final case class VirtualData(content: Array[Byte], source: String)
    extends Virtual




© 2015 - 2025 Weber Informatics LLC | Privacy Policy