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

com.codacy.tools.scala.seed.traits.Builder.scala Maven / Gradle / Ivy

package com.codacy.tools.scala.seed.traits

import java.io.File
import java.nio.file.Path

import com.codacy.tools.scala.seed.utils.CommandRunner

import scala.util.{Failure, Success, Try}

sealed trait Builder {

  val command: List[String]
  val pathComponents: Seq[String]

  def supported(path: Path): Boolean

  def targetOfDirectory(path: File): Option[String]

  private def buildWithCommand(command: List[String], path: Path): Try[Boolean] = {
    CommandRunner.exec(command, dir = Option(path.toFile)) match {
      case Left(failure) => Failure(failure)
      case Right(output) if output.exitCode != 0 =>
        Failure(new Exception("Can't compile project."))

      case Right(_) => Success(true)
    }
  }

  def build(path: Path): Try[Boolean] = {
    buildWithCommand(command, path)
  }
}

object MavenBuilder extends Builder {
  val command = List("mvn", "compile")
  val pathComponents = Seq("src", "main", "java")

  def supported(path: Path): Boolean = {
    path.toFile.list.contains("pom.xml")
  }

  def targetOfDirectory(path: File): Option[String] = {
    Some(Seq(path.getAbsolutePath, "target", "classes").mkString(File.separator))
  }

}

object SBTBuilder extends Builder {

  val command = List("sbt", "compile")
  val pathComponents = Seq("src", "main", "scala")

  def supported(path: Path): Boolean = {
    path.toFile.list.contains("build.sbt")
  }

  def targetOfDirectory(path: File): Option[String] = {
    val target = new File(path.getAbsolutePath, "target")
    Option(target.exists).flatMap {
      case true =>
        val potentialScalaDir = target.list.find(filepath => filepath.startsWith("scala-"))
        potentialScalaDir.map(scalaDirectory => target.toPath.resolve(scalaDirectory).resolve("classes").toString)
      case false =>
        Option.empty
    }
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy