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

mb.pie.runtime.exec.ExecContext.kt Maven / Gradle / Ivy

The newest version!
package mb.pie.runtime.exec

import mb.fs.api.node.FSNode
import mb.fs.api.path.FSPath
import mb.pie.api.*
import mb.pie.api.exec.Cancelled
import mb.pie.api.fs.stamp.FileSystemStamper
import mb.pie.api.fs.toNode
import mb.pie.api.stamp.*

internal class ExecContextImpl(
  private val requireTask: RequireTask,
  private val cancel: Cancelled,
  private val taskDefs: TaskDefs,
  private val resourceSystems: ResourceSystems,
  private val store: Store,
  private val defaultOutputStamper: OutputStamper,
  override val defaultRequireFileSystemStamper: FileSystemStamper,
  override val defaultProvideFileSystemStamper: FileSystemStamper,
  override val logger: Logger
) : ExecContext {
  private val taskRequires = arrayListOf()
  private val resourceRequires = arrayListOf()
  private val resourceProvides = arrayListOf()


  override fun  require(task: Task): O {
    return require(task, defaultOutputStamper)
  }

  override fun  require(task: Task, stamper: OutputStamper): O {
    cancel.throwIfCancelled()
    val key = task.key()
    val output = requireTask.require(key, task, cancel)
    val stamp = stamper.stamp(output)
    taskRequires.add(TaskRequireDep(key, stamp))
    Stats.addCallReq()
    return output
  }

  override fun  require(taskDef: TaskDef, input: I): O {
    return require(Task(taskDef, input), defaultOutputStamper)
  }

  override fun  require(taskDef: TaskDef, input: I, stamper: OutputStamper): O {
    return require(Task(taskDef, input), stamper)
  }

  override fun  require(task: STask): Out {
    return require(task.toTask(taskDefs), defaultOutputStamper)
  }

  override fun  require(task: STask, stamper: OutputStamper): Out {
    return require(task.toTask(taskDefs), stamper)
  }

  override fun  require(taskDefId: String, input: I): Out {
    val taskDef = getTaskDef(taskDefId)
    return require(Task(taskDef, input), defaultOutputStamper)
  }

  override fun  require(taskDefId: String, input: I, stamper: OutputStamper): Out {
    val taskDef = getTaskDef(taskDefId)
    return require(Task(taskDef, input), stamper)
  }

  private fun  getTaskDef(id: String) = taskDefs.getTaskDef(id)
    ?: throw RuntimeException("Cannot retrieve task with identifier $id, it cannot be found")


  override fun  require(resource: R, stamper: ResourceStamper) {
    @Suppress("UNCHECKED_CAST") val stamp = stamper.stamp(resource) as ResourceStamp
    resourceRequires.add(ResourceRequireDep(resource.key(), stamp))
    Stats.addFileReq()
  }

  override fun  provide(resource: R, stamper: ResourceStamper) {
    @Suppress("UNCHECKED_CAST") val stamp = stamper.stamp(resource) as ResourceStamp
    resourceProvides.add(ResourceProvideDep(resource.key(), stamp))
    Stats.addFileGen()
  }


  override fun require(path: FSPath): FSNode {
    return require(path, defaultRequireFileSystemStamper)
  }

  override fun require(path: FSPath, stamper: FileSystemStamper): FSNode {
    val resourceSystem = resourceSystems.getResourceSystem(path.fileSystemId)
      ?: throw RuntimeException("Cannot get resource system for path $path; resource system with id ${path.fileSystemId} does not exist")
    val node = path.toNode(resourceSystem)
    require(node, stamper)
    return node
  }

  override fun provide(path: FSPath) {
    return provide(path, defaultProvideFileSystemStamper)
  }

  override fun provide(path: FSPath, stamper: FileSystemStamper) {
    val resourceSystem = resourceSystems.getResourceSystem(path.fileSystemId)
      ?: throw RuntimeException("Cannot get resource system for path $path; resource system with id ${path.fileSystemId} does not exist")
    val node = path.toNode(resourceSystem)
    provide(node, stamper)
  }


  override fun toNode(path: FSPath): FSNode {
    val resourceSystem = resourceSystems.getResourceSystem(path.fileSystemId)
      ?: throw RuntimeException("Cannot get resource system for path $path; resource system with id ${path.fileSystemId} does not exist")
    val node = path.toNode(resourceSystem)
    return node
  }


  data class Deps(val taskRequires: ArrayList, val resourceRequires: ArrayList, val resourceProvides: ArrayList)

  fun deps() = Deps(taskRequires, resourceRequires, resourceProvides)
}