代码之家  ›  专栏  ›  技术社区  ›  Oleg

如何用一个TypeMapper将任何protobuf枚举生成为String?

  •  0
  • Oleg  · 技术社区  · 4 年前

    例如,我的proto模式中有一些枚举:

    enum E1 {
         UNKNOWN = 0;
         OPTION_1 = 1;
         OPTION_2 = 2;
         OPTION_3 = 3;
    }
    
    enum E2 {
         UNKNOWN = 0;
         ANOTHER_OPTION_1 = 1;
         ANOTHER_OPTION_2 = 2;
         ANOTHER_OPTION_3 = 3;
    }
    
    message M {
        E1 my_enum_1 = 1;
        E2 my_enum_2 = 2;
    }
    

    我可以通过提供 scalaPB TypeMapper s:

    TypeMapper(_.name)(E1.fromName(_).get)
    TypeMapper(_.name)(E2.fromName(_).get)
    

    但我不想为任何单个枚举复制粘贴相同的TypeMapper

    有没有办法为所有枚举只制作一个TypeMapper scalaPB ?

    0 回复  |  直到 4 年前
        1
  •  2
  •   thesamet    4 年前

    是的,这是可以做到的。

    如果您想让ScalaPB对包中的所有枚举使用String,您可以添加 package-scoped options 文件,告诉ScalaPB将每个枚举的scala类型设置为 String 使用 field transformations :

    // options.proto:
    syntax = "proto3";
    
    import "scalapb/scalapb.proto";
    
    option (scalapb.options) = {
      scope: PACKAGE,
      field_transformations : [
        {
          when : {
            type: TYPE_ENUM
          }
          set : {[scalapb.field] {type : 'String'}}
        }
    }
    

    下一步将为所有枚举定义一个类型映射器。借用伊凡的回答,这可以定义如下:

    implicit def enumMapper[E <: GeneratedEnum](implicit ec: GeneratedEnumCompanion[E]) =
      TypeMapper[E, String](_.name)(ec.fromName(_).get)
    

    如果将上述代码添加到与生成的代码相同的包中的包对象, 使用导入 import 选项,类型映射器将在隐式搜索中找到。

        2
  •  1
  •   Ivan Stanislavciuc    4 年前

    你无法完全避免定义 TypeMapper 每个 enum 类型。但是您可以创建一个helper方法来创建 TypeMapper 实例。

    例如

    import scalapb.GeneratedEnum
    import scalapb.GeneratedEnumCompanion
    import scalapb.TypeMapper
    
    def enumMapper[E <: GeneratedEnum: GeneratedEnumCompanion] = {
      TypeMapper[E, String](_.name)(implicitly[GeneratedEnumCompanion[E]].fromName(_).get)
    }
    

    ---更新---

    关注@samet评论,如果您添加 implicit 对于上面的方法,并在您的隐式上下文中提供它,它就会起作用。

    这可以通过编译以下代码进行测试

    implicit def enumMapper...
    
    val Enum1Mapper = implicitly[TypeMapper[E1]]
    
    
    推荐文章