使用 scalapb 为地图编写 TypeMapper
Writing TypeMapper for map with scalapb
我想制作 map
以防 class 从包装在 Option
中的 protobuf 生成
case class Foo(aMap: Option[Map[String, String]])
为此,我正在尝试使用 scalapb.TypeMapper
package some.wrapper
import scalapb.TypeMapper
case class StringMapWrapper(map: Map[String, String])
object StringMapWrapper {
implicit val mapper = TypeMapper(StringMapWrapper.apply)(_.map)
}
原始文件如下所示:
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.
我该如何解决这个错误?
在 ScalaPB 中获取选项内部内容的标准方法是将其包装在消息中:
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;
}
由于 OptionalMap
上的 type
选项,ScalaPB 将生成 myMap 作为 Option[Map[String, String]]
而不是 Option[OptionalMap]
。那么我们唯一需要知道的就是提供一个 TypeMapper 来教 ScalaPB 在 OptionalMap 和 Map[String, String] 之间进行转换。为此,将以下内容添加到包对象 UseCase
中:
package object some {
implicit val OptionalMapMapper =
scalapb.TypeMapper[some.myfile.OptionalMap, Map[String, String]](_.inner)(some.myfile.OptionalMap(_))
}
我想制作 map
以防 class 从包装在 Option
case class Foo(aMap: Option[Map[String, String]])
为此,我正在尝试使用 scalapb.TypeMapper
package some.wrapper
import scalapb.TypeMapper
case class StringMapWrapper(map: Map[String, String])
object StringMapWrapper {
implicit val mapper = TypeMapper(StringMapWrapper.apply)(_.map)
}
原始文件如下所示:
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.
我该如何解决这个错误?
在 ScalaPB 中获取选项内部内容的标准方法是将其包装在消息中:
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;
}
由于 OptionalMap
上的 type
选项,ScalaPB 将生成 myMap 作为 Option[Map[String, String]]
而不是 Option[OptionalMap]
。那么我们唯一需要知道的就是提供一个 TypeMapper 来教 ScalaPB 在 OptionalMap 和 Map[String, String] 之间进行转换。为此,将以下内容添加到包对象 UseCase
中:
package object some {
implicit val OptionalMapMapper =
scalapb.TypeMapper[some.myfile.OptionalMap, Map[String, String]](_.inner)(some.myfile.OptionalMap(_))
}