Написание TypeMapper для карты с помощью Scalapb - PullRequest
0 голосов
/ 14 мая 2019

Я хотел бы сделать map в случае, если класс, сгенерированный из protobuf, обернутый в 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.

Как я могу исправить эту ошибку?

1 Ответ

1 голос
/ 15 мая 2019

Стандартный способ в ScalaPB получить что-то внутри Option - заключить его в сообщение:

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 и Map [String, String].Для этого добавьте следующее к объекту пакета UseCase в:

package object some {
  implicit val OptionalMapMapper =
      scalapb.TypeMapper[some.myfile.OptionalMap, Map[String, String]](_.inner)(some.myfile.OptionalMap(_))
}
...