daml/scala-protoc-plugins/scala-akka/AkkaStreamGenerator.scala
Gary Verhaegen d2e2c21684
update copyright headers (#12240)
New year, new copyright, new expected unknown issues with various files
that won't be covered by the script and/or will be but shouldn't change.

I'll do the details on Jan 1, but would appreciate this being
preapproved so I can actually get it merged by then.

CHANGELOG_BEGIN
CHANGELOG_END
2022-01-03 16:36:51 +00:00

84 lines
3.4 KiB
Scala

// Copyright (c) 2022 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
// SPDX-License-Identifier: Apache-2.0
package com.daml.protoc.plugins.akka
import com.google.protobuf.Descriptors._
import com.google.protobuf.ExtensionRegistry
import com.google.protobuf.compiler.PluginProtos.{CodeGeneratorRequest, CodeGeneratorResponse}
import protocbridge.ProtocCodeGenerator
import protocgen.{CodeGenRequest, CodeGenResponse}
import scalapb.compiler._
import scalapb.options.Scalapb
import scala.jdk.CollectionConverters._
// This file is mostly copied over from ScalaPbCodeGenerator and ProtobufGenerator
object AkkaStreamGenerator extends ProtocCodeGenerator {
override def run(req: Array[Byte]): Array[Byte] = {
val registry = ExtensionRegistry.newInstance()
Scalapb.registerAllExtensions(registry)
val request = CodeGeneratorRequest.parseFrom(req, registry)
handleCodeGeneratorRequest(CodeGenRequest(request)).toCodeGeneratorResponse.toByteArray
}
def handleCodeGeneratorRequest(request: CodeGenRequest): CodeGenResponse =
parseParameters(request.parameter) match {
case Right(params) =>
implicit val descriptorImplicits: DescriptorImplicits =
DescriptorImplicits.fromCodeGenRequest(params, request)
try {
val filesByName: Map[String, FileDescriptor] =
request.allProtos.map(fd => fd.getName -> fd).toMap
val validator = new ProtoValidation(descriptorImplicits)
filesByName.values.foreach(validator.validateFile)
val responseFiles = request.filesToGenerate.flatMap(generateServiceFiles(_))
CodeGenResponse.succeed(responseFiles)
} catch {
case exception: GeneratorException =>
CodeGenResponse.fail(exception.message)
}
case Left(error) =>
CodeGenResponse.fail(error)
}
private def parseParameters(params: String): Either[String, GeneratorParams] = {
params
.split(",")
.map(_.trim)
.filter(_.nonEmpty)
.foldLeft[Either[String, GeneratorParams]](Right(GeneratorParams())) {
case (Right(params), "java_conversions") => Right(params.copy(javaConversions = true))
case (Right(params), "flat_package") => Right(params.copy(flatPackage = true))
case (Right(params), "grpc") => Right(params.copy(grpc = true))
case (Right(params), "single_line_to_proto_string") =>
Right(params.copy(singleLineToProtoString = true))
case (Right(params), "ascii_format_to_string") =>
Right(params.copy(asciiFormatToString = true))
case (Right(_), p) => Left(s"Unrecognized parameter: '$p'")
case (x, _) => x
}
}
private def generateServiceFiles(
file: FileDescriptor
)(implicit
descriptorImplicits: DescriptorImplicits
): collection.Seq[CodeGeneratorResponse.File] = {
import descriptorImplicits._
file.getServices.asScala.flatMap { service =>
val printer = new AkkaGrpcServicePrinter(service)
printer.printService(FunctionalPrinter()).fold[List[CodeGeneratorResponse.File]](Nil) { p =>
val code = p.result()
val fileBuilder = CodeGeneratorResponse.File.newBuilder()
fileBuilder.setName(file.scalaDirectory + "/" + service.name + "AkkaGrpc.scala")
fileBuilder.setContent(code)
List(fileBuilder.build())
}
}
}
val deprecatedAnnotation: String =
"""@scala.deprecated(message="Marked as deprecated in proto file", "")"""
}