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

scala.cli.exportCmd.JsonProject.scala Maven / Gradle / Ivy

There is a newer version: 1.5.0
Show newest version
package scala.cli.exportCmd

import com.github.plokhotnyuk.jsoniter_scala.core.{JsonValueCodec, WriterConfig, writeToStream}
import com.github.plokhotnyuk.jsoniter_scala.macros.{CodecMakerConfig, JsonCodecMaker}
import coursier.Dependency
import coursier.util.Artifact
import dependency.AnyDependency

import java.io.PrintStream
import java.nio.charset.StandardCharsets

import scala.build.info.{BuildInfo, ExportDependencyFormat, ScopedBuildInfo}
import scala.build.options.ConfigMonoid
import scala.cli.util.SeqHelpers.*
import scala.reflect.NameTransformer
import scala.util.{Properties, Using}

final case class JsonProject(buildInfo: BuildInfo) extends Project {
  def sorted = this.copy(
    buildInfo = buildInfo.copy(
      scopes = buildInfo.scopes.map { case (k, v) => k -> v.sorted }
    )
  )

  def withEmptyScopesRemoved = this.copy(
    buildInfo = buildInfo.copy(
      scopes = buildInfo.scopes.filter(_._2 != ScopedBuildInfo.empty)
    )
  )

  def writeTo(dir: os.Path): Unit = {
    val config = WriterConfig.withIndentionStep(1)

    Using(os.write.outputStream(dir / "export.json")) {
      outputStream =>
        writeToStream(
          sorted.withEmptyScopesRemoved.buildInfo,
          outputStream,
          config
        )(
          using JsonProject.jsonCodecBuildInfo
        )
    }
  }

  def print(printStream: PrintStream): Unit = {
    val config = WriterConfig.withIndentionStep(1)

    writeToStream(
      sorted.withEmptyScopesRemoved.buildInfo,
      printStream,
      config
    )(
      using JsonProject.jsonCodecBuildInfo
    )
  }
}

extension (s: ScopedBuildInfo) {
  def sorted(using ord: Ordering[String]) = s.copy(
    s.sources.sorted,
    s.scalacOptions.sorted,
    s.scalaCompilerPlugins.sorted(using JsonProject.ordering),
    s.dependencies.sorted(using JsonProject.ordering),
    s.compileOnlyDependencies.sorted(using JsonProject.ordering),
    s.resolvers.sorted,
    s.resourceDirs.sorted,
    s.customJarsDecls.sorted
  )
}

object JsonProject {
  implicit lazy val jsonCodecBuildInfo: JsonValueCodec[BuildInfo]             = JsonCodecMaker.make
  implicit lazy val jsonCodecScopedBuildInfo: JsonValueCodec[ScopedBuildInfo] = JsonCodecMaker.make

  implicit val ordering: Ordering[ExportDependencyFormat] =
    Ordering.by(x => x.groupId + x.artifactId.fullName)
  implicit lazy val jsonCodecExportDependencyFormat: JsonValueCodec[ExportDependencyFormat] =
    JsonCodecMaker.make
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy