aboutsummaryrefslogblamecommitdiff
path: root/plugins/scalapb/ScalaPB.scala
blob: f3e8b8c551ebb69d57c8745a922da048cef3c055 (plain) (tree)










































                                                                                       

                                                     
                              

                                                             










                                                                                
                                                            











                                                            
package cbt

import com.trueaccord.scalapb._
import _root_.protocbridge.ProtocBridge
import _root_.scalapb.ScalaPbCodeGenerator
import java.io.File

trait Scalapb extends BaseBuild{
  override def dependencies = super.dependencies ++ Resolver( mavenCentral ).bind(
    ScalaDependency(
      "com.trueaccord.scalapb", "scalapb-runtime", cbt.scalapb.BuildInfo.scalaPBVersion
    )
  )

  def scalapb = Scalapb.apply(lib).config(
    input = projectDirectory / "protobuf-schemas",
    output = projectDirectory / "src_generated"
  )
}

sealed trait ProtocVersion
object ProtocVersion{
  case object v310 extends ProtocVersion
  case object v300 extends ProtocVersion
  case object v261 extends ProtocVersion
  case object v250 extends ProtocVersion
  case object v241 extends ProtocVersion
}

object Scalapb{
  case class apply(lib: Lib){
    case class config(
      input: File,
      output: File,
      version: ProtocVersion = ProtocVersion.v310,
      flatPackage: Boolean = false,
      javaConversions: Boolean = false,
      grpc: Boolean = true,
      singleLineToString: Boolean = false
    ){
      def apply = {
        output.mkdirs
        val protoFiles = input.listRecursive.filter(_.isFile).map(_.string).toArray
        val options = Seq(
          javaConversions.option("java_conversions"),
          grpc.option("grpc"),
          singleLineToString.option("single_line_to_string"),
          flatPackage.option("flat_package")
        ).flatten.mkString(",")
        import _root_.protocbridge.frontend.PluginFrontend
        val pluginFrontend: PluginFrontend = PluginFrontend.newInstance()
        val (scriptPath, state) = pluginFrontend.prepare( ScalaPbCodeGenerator )
        try {
          lib.redirectOutToErr(
            ExitCode(
              com.github.os72.protocjar.Protoc.runProtoc(
                Array(
                  "-" ++ version.getClass.getSimpleName.stripSuffix("$"),
                  "-I=" ++ input.string,
                  s"--scala_out=$options:" ++ output.string,
                  s"--plugin=protoc-gen-scala=${scriptPath}"
                ) ++ protoFiles
              )
            )
          )
        } finally {
          pluginFrontend.cleanup(state)
        }
      }
    }
  }
}