Scalapb打字机适用于定制原始包装纸



我正在使用

addSbtPlugin("com.thesamet" % "sbt-protoc" % "0.99.23")
libraryDependencies += "com.thesamet.scalapb" %% "compilerplugin" % "0.9.0-M7"

我有一些自定义原始包装器(我们不使用Google包装器(

syntax = "proto3";
package com.github.piotrkowalczuk.ntypes;
// Int32 represents a int32 that may be nil.
message Int32 {
    int32 int32 = 1;
    bool valid = 2;
}

,然后我想在另一个消息中使用原始包装器消息Int32,但自动在Scala案例类中解开包装值:

syntax = "proto3";
package com.github.fpopic;
import "scalapb/scalapb.proto";
import "ntypes.proto";
message Usage {
    com.github.piotrkowalczuk.ntypes.Int32 ntype_primitive = 1 [(scalapb.field).type = "Option[Int]"];
}

我创建了一个简单的Main.scala来指定自定义TypeMapper

package com.github.fpopic
import com.github.piotrkowalczuk.ntypes.ntypes.Int32
import scalapb.TypeMapper
object Main {
  implicit val ntypeInt32ToInt: TypeMapper[Int32, Option[Int]] =
    TypeMapper[Int32, Option[Int]] {
      ntypeInt32: Int32 => if (ntypeInt32.valid) Some(ntypeInt32.int32) else None
    } {
      optInt: Option[Int] => Int32(optInt.getOrElse(0), valid = optInt.isDefined)
    }
  def main(args: Array[String]): Unit = {
    implicitly[TypeMapper[Int32, Option[Int]]]
    val u: Usage = new Usage(
      ntypePrimitive = Option(1234)
    )
  }
}

因此,由于每个message都会自动获得Option,因此想进入Scala Option[Int],而不是Option[Int32]甚至Option[Option[Int]]

但是我遇到了错误:

No TypeMapper found for conversion between com.github.piotrkowalczuk.ntypes.ntypes.Int32 and Option[Int].

这可以通过在此字段上将no_box设置为true来实现,除了Option[Int]的自定义类型。

为了使生成的代码找到隐式TypeMapper,您可以将其放在与生成代码(或其任何父母中的任何一个包的包装对象(中

package com.github
package object fpopic {
  implicit val myTypemapper = ...
}

最新更新