首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用scalapb编写地图TypeMapper

用scalapb编写地图TypeMapper
EN

Stack Overflow用户
提问于 2019-05-14 17:27:57
回答 1查看 449关注 0票数 0

我想让map在用Option包装的protobuf生成的情况下生成。

case class Foo(aMap: Option[Map[String, String]])

为此,我尝试使用scalapb.TypeMapper

代码语言:javascript
复制
package some.wrapper
import scalapb.TypeMapper
case class StringMapWrapper(map: Map[String, String])
object StringMapWrapper {
  implicit val mapper = TypeMapper(StringMapWrapper.apply)(_.map)
}

而proto文件看起来是这样的:

代码语言:javascript
复制
syntax = "proto3";
package some;
import "scalapb/scalapb.proto";
message Foo {
  map<string, string> a_map = 1 [(scalapb.field).type = "some.wrapper.StringMapWrapper"];
}

但是在编译过程中,我遇到了一个错误:--scala_out: some.Foo.a_map: Field a_map is a map and has type specified. Use key_type or value_type instead.

如何纠正此错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-15 02:17:31

在ScalaPB中获取选项中某些内容的标准方法是将其包装在消息中:

代码语言:javascript
复制
syntax = "proto3";
package some;
import "scalapb/scalapb.proto";

message OptionalMap {
  option (scalapb.message).type = "Map[String, String]";
  map<string, string> inner = 1;
}

message UseCase {
  OptionalMap my_map = 1;
}

由于type选项在OptionalMap上,ScalaPB将生成myMap作为Option[Map[String, String]]而不是Option[OptionalMap]。那么,我们唯一需要知道的就是提供一个TypeMapper,它将教ScalaPB如何在OptionalMap和MapString之间转换字符串。为此,将以下内容添加到包对象UseCase中:

代码语言:javascript
复制
package object some {
  implicit val OptionalMapMapper =
      scalapb.TypeMapper[some.myfile.OptionalMap, Map[String, String]](_.inner)(some.myfile.OptionalMap(_))
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56135648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档