aboutsummaryrefslogtreecommitdiff
path: root/plugins/scalapb/ScalaPB.scala
blob: f3e8b8c551ebb69d57c8745a922da048cef3c055 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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)
        }
      }
    }
  }
}