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

mb.pie.runtime.Pie.kt Maven / Gradle / Ivy

The newest version!
package mb.pie.runtime

import mb.fs.java.JavaFileSystem
import mb.pie.api.*
import mb.pie.api.exec.BottomUpExecutor
import mb.pie.api.exec.TopDownExecutor
import mb.pie.api.fs.FileSystemResourceSystem
import mb.pie.api.fs.stamp.FileSystemStamper
import mb.pie.api.fs.stamp.FileSystemStampers
import mb.pie.api.stamp.OutputStamper
import mb.pie.api.stamp.output.OutputStampers
import mb.pie.runtime.exec.BottomUpExecutorImpl
import mb.pie.runtime.exec.TopDownExecutorImpl
import mb.pie.runtime.layer.ValidationLayer
import mb.pie.runtime.logger.NoopLogger
import mb.pie.runtime.logger.exec.LoggerExecutorLogger
import mb.pie.runtime.resourcesystems.MapResourceSystems
import mb.pie.runtime.share.NonSharingShare
import mb.pie.runtime.store.InMemoryStore

class PieBuilderImpl : PieBuilder {
  private var taskDefs: TaskDefs? = null
  private var resourceSystems: ResourceSystems? = null
  private var store: (Logger) -> Store = { InMemoryStore() }
  private var share: (Logger) -> Share = { NonSharingShare() }
  private var defaultOutputStamper: OutputStamper = OutputStampers.equals
  private var defaultRequireFileSystemStamper: FileSystemStamper = FileSystemStampers.modified
  private var defaultProvideFileSystemStamper: FileSystemStamper = FileSystemStampers.modified
  private var layerFactory: ((Logger) -> Layer) = { logger -> ValidationLayer(logger) }
  private var logger: Logger = NoopLogger()
  private var executorLoggerFactory: (Logger) -> ExecutorLogger = { logger -> LoggerExecutorLogger(logger) }

  override fun withTaskDefs(taskDefs: TaskDefs): PieBuilderImpl {
    this.taskDefs = taskDefs
    return this
  }

  override fun withResourceSystems(resourceSystems: ResourceSystems): PieBuilder {
    this.resourceSystems = resourceSystems
    return this
  }

  override fun withStore(store: (Logger) -> Store): PieBuilderImpl {
    this.store = store
    return this
  }

  override fun withShare(share: (Logger) -> Share): PieBuilderImpl {
    this.share = share
    return this
  }

  override fun withDefaultOutputStamper(stamper: OutputStamper): PieBuilderImpl {
    this.defaultOutputStamper = stamper
    return this
  }

  override fun withDefaultRequireFileSystemStamper(stamper: FileSystemStamper): PieBuilderImpl {
    this.defaultRequireFileSystemStamper = stamper
    return this
  }

  override fun withDefaultProvideFileSystemStamper(stamper: FileSystemStamper): PieBuilderImpl {
    this.defaultProvideFileSystemStamper = stamper
    return this
  }

  override fun withLayer(layer: (Logger) -> Layer): PieBuilderImpl {
    this.layerFactory = layer
    return this
  }

  override fun withLogger(logger: Logger): PieBuilderImpl {
    this.logger = logger
    return this
  }

  override fun withExecutorLogger(executorLogger: (Logger) -> ExecutorLogger): PieBuilderImpl {
    this.executorLoggerFactory = executorLogger
    return this
  }


  override fun build(): PieImpl {
    val taskDefs = this.taskDefs ?: throw RuntimeException("Task definitions were not set before building")
    val resourceSystems = run {
      if(resourceSystems != null) {
        resourceSystems!!
      } else {
        val resourceSystems = MapResourceSystems(mapOf(
          Pair(JavaFileSystem.id, FileSystemResourceSystem(JavaFileSystem.instance))
        ))
        resourceSystems
      }
    }
    val store = this.store(logger)
    val share = this.share(logger)
    val topDownExecutor = TopDownExecutorImpl(taskDefs, resourceSystems, store, share, defaultOutputStamper, defaultRequireFileSystemStamper, defaultProvideFileSystemStamper, layerFactory, logger, executorLoggerFactory)
    val bottomUpExecutor = BottomUpExecutorImpl(taskDefs, resourceSystems, store, share, defaultOutputStamper, defaultRequireFileSystemStamper, defaultProvideFileSystemStamper, layerFactory, logger, executorLoggerFactory)
    return PieImpl(topDownExecutor, bottomUpExecutor, taskDefs, resourceSystems, store, share, defaultOutputStamper, defaultRequireFileSystemStamper, defaultProvideFileSystemStamper, layerFactory, logger, executorLoggerFactory)
  }
}

operator fun PieBuilder.invoke(): PieBuilderImpl {
  return PieBuilderImpl()
}

@Suppress("unused")
class PieImpl(
  override val topDownExecutor: TopDownExecutor,
  override val bottomUpExecutor: BottomUpExecutor,
  val taskDefs: TaskDefs,
  val resourceSystems: ResourceSystems,
  val store: Store,
  val share: Share,
  val defaultOutputStamper: OutputStamper,
  val defaultRequireFileSystemStamper: FileSystemStamper,
  val defaultProvideFileSystemStamper: FileSystemStamper,
  val layerFactory: (Logger) -> Layer,
  val logger: Logger,
  val executorLoggerFactory: (Logger) -> ExecutorLogger
) : Pie {
  override fun dropStore() {
    store.writeTxn().use { it.drop() }
  }

  override fun close() {
    store.close()
  }

  override fun toString() =
    "PieImpl($store, $share, $defaultOutputStamper, $defaultRequireFileSystemStamper, $defaultProvideFileSystemStamper, ${layerFactory(logger)})"
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy