将协议缓冲区编译器生成的 Scala 代码从 .proto 文件映射到简单的 Scala 案例类

问题描述 投票:0回答:1

是否有一个库可以将 Protocol Buffer 编译器生成的 Scala 代码从 .proto 文件映射到简单的 Scala 案例类。大文件没有映射器功能

协议缓冲区编译器从 .proto 文件生成的 Scala 代码示例:

final case class PartnerConversionRates(
    conversionRate: _root_.scala.Option[_root_.scala.Double] = _root_.scala.None,
    redemptionFactor: _root_.scala.Option[_root_.scala.Double] = _root_.scala.None,
    unknownFields: _root_.scalapb.UnknownFieldSet = _root_.scalapb.UnknownFieldSet.empty
    ) extends scalapb.GeneratedMessage with scalapb.lenses.Updatable[PartnerConversionRates] {
    @transient
    private[this] var __serializedSizeCachedValue: _root_.scala.Int = 0
    private[this] def __computeSerializedValue(): _root_.scala.Int = {
      var __size = 0
      if (conversionRate.isDefined) {
        val __value = com.myCompany.my_team.myClass.proto.PartnerConversionRates._typemapper_conversionRate.toBase(conversionRate.get)
        __size += 1 + _root_.com.google.protobuf.CodedOutputStream.computeUInt32SizeNoTag(__value.serializedSize) + __value.serializedSize
      };
      if (redemptionFactor.isDefined) {
        val __value = com.myCompany.my_team.myClass.proto.PartnerConversionRates._typemapper_redemptionFactor.toBase(redemptionFactor.get)
        __size += 1 + _root_.com.google.protobuf.CodedOutputStream.computeUInt32SizeNoTag(__value.serializedSize) + __value.serializedSize
      };
      __size += unknownFields.serializedSize
      __size
    }
    .
    .
    .
}

案例课

case class PartnerConversionRates(
  /* Conversion Rate of partner */
  conversionRate: Option[Double] = None,
  /* Redemption Rate of partner */
  redemptionFactor: Option[Double] = None
)

或者我必须手动映射吗?

我没有得到任何支持。

scala implicit scalapb
1个回答
1
投票

案例类之间的映射是 Chimney 的基本用例之一(免责声明:我是图书馆的作者之一):

import io.scalaland.chimney.dsl._

// You named both case classes the same name,
// so I assumed that they would be in different packages

val proto: proto.PartnerConversionRates = ...

// proto -> domain:

// All target fields are present in source case class
// and the types inside match.
val domain = proto.into[domain.PartnerConversionRates].transform

// domain -> proto:

// Field unknownFields is absent so we are setting it manually.
domain
  .into[proto.PartnerConversionRates]
  .withFieldConst(_.unknownFields, _root_.scalapb.UnknownFieldSet.empty)
  .transform

// Alternatively, allow using default values.
domain
  .into[proto.PartnerConversionRates]
  .enableDefaultValues
  .transform

您还可以通过使用一些 ScalaPB 选项 来让您的生活更轻松

import "scalapb/scalapb.proto";

option (scalapb.options) = {
  preserve_unknown_fields: false
};

首先不生成

unknownFields
(如果您不使用此字段进行任何解析错误报告,则很有用)。

Chimney 库还支持另一种情况:转换不是总函数、递归转换、密封层次结构、Java Beans 等。Scala 3 支持在路上,但如果你需要它,还有不同作者的另一个库仅针对 Scala 3 - Ducktape.

所有现实生活中的用例都有很多我们可能会遗漏的边缘案例,所以如果您阅读文档并发现某些地方没有按预期工作,您可以发布带有错误报告或功能请求的票证。

© www.soinside.com 2019 - 2024. All rights reserved.