找不到用于自定义原始包装器的 ScalaPB TypeMapper
ScalaPB TypeMapper for custom primitive wrappers not found
我正在使用
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 案例 class:
中自动取消嵌套包装值
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)
)
}
}
所以想进入 Scala Option[Int]
而不是 Option[Int32]
甚至 Option[Option[Int]]
,因为每个 message
都会自动获得 Option
.
但我收到错误消息:
No TypeMapper found for conversion between com.github.piotrkowalczuk.ntypes.ntypes.Int32 and Option[Int].
除了 Option[Int]
.
的自定义类型之外,还可以通过将此字段的 no_box
设置为 true 来实现
为了使生成的代码能够找到隐式类型映射器,您可以将它放在与生成的代码(或其任何父代)相同的包的包对象中
package com.github
package object fpopic {
implicit val myTypemapper = ...
}
我正在使用
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 案例 class:
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)
)
}
}
所以想进入 Scala Option[Int]
而不是 Option[Int32]
甚至 Option[Option[Int]]
,因为每个 message
都会自动获得 Option
.
但我收到错误消息:
No TypeMapper found for conversion between com.github.piotrkowalczuk.ntypes.ntypes.Int32 and Option[Int].
除了 Option[Int]
.
no_box
设置为 true 来实现
为了使生成的代码能够找到隐式类型映射器,您可以将它放在与生成的代码(或其任何父代)相同的包的包对象中
package com.github
package object fpopic {
implicit val myTypemapper = ...
}