首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找不到自定义基元包装的ScalaPB TypeMapper

找不到自定义基元包装的ScalaPB TypeMapper
EN

Stack Overflow用户
提问于 2019-07-01 00:15:20
回答 1查看 310关注 0票数 0

我正在使用

代码语言:javascript
复制
addSbtPlugin("com.thesamet" % "sbt-protoc" % "0.99.23")
libraryDependencies += "com.thesamet.scalapb" %% "compilerplugin" % "0.9.0-M7"

我有一些自定义的原语包装器(我们没有使用google包装器)

代码语言:javascript
复制
syntax = "proto3";

package com.github.piotrkowalczuk.ntypes;

// Int32 represents a int32 that may be nil.
message Int32 {
    int32 int32 = 1;
    bool valid = 2;
}

然后,我想在另一条消息中使用原语包装器message Int32,但在Scala case类中自动解嵌包装值:

代码语言:javascript
复制
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

代码语言:javascript
复制
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

但是我得到了一个错误:

代码语言:javascript
复制
No TypeMapper found for conversion between com.github.piotrkowalczuk.ntypes.ntypes.Int32 and Option[Int].
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-01 12:09:27

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

为了使生成的代码能够找到隐式类型映射器,您可以将它放在与生成的代码(或其任何父代码)相同的包的包对象中。

代码语言:javascript
复制
package com.github

package object fpopic {
  implicit val myTypemapper = ...
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56826332

复制
相关文章

相似问题

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