如何编码带有约束的类型安全avro库的递归类型

时间:2017-12-15 13:40:51

标签: scala avro

由于这个问题我现在真的很难过,我以为我会问这里。

所以这就是问题所在。我目前正在尝试编写一个库来以类型安全的方式表示Avro Schemas,然后应该允许在结构上查询模式的给定运行时值。例如。我的架构是否包含特定路径中给定名称的字段?架构是否平坦(除顶层外不包含可嵌套类型)?等等 您可以在此处找到Avro架构的完整规范:https://avro.apache.org/docs/1.8.2/spec.html

现在我在代码中决定模式的表示时遇到了一些麻烦。现在我正在使用像这样的ADT,因为它使用Circe解码AvroSchema(它是JSON)非常容易,所以你可以稍微忽略像这个问题的精炼类型之类的东西。 https://gist.github.com/GrafBlutwurst/681e365ecbb0ecad2acf4044142503a9请注意,这不是确切的实施。我有一个能够正确解码模式,但后来查询很痛苦。 无论如何我想知道:

1)有没有人有一个好主意如何编码AVRO Union上的Typerestriction。 Avro Unions不能直接包含其他联盟,但可以包含记录,然后再包含Unions。联盟 - >不允许工会,但工会 - >记录 - >工会还可以。

2)以Fix,Free和CoFree的形式使用fixpoint递归会使查询更容易吗?因为我还没有使用过这些经验,所以我有点蠢蠢欲动。

谢谢!

PS:这里有一些关于为什么Refined在那里的更详细说明。最后我想启用一些非常具体的用途,例如这个伪代码(我不太确定它是否完全可能吗?:

refine[Schema Refined IsFlat](schema) //because it's flat I know it can only be a Recordtype with Fields of Primitives or Optionals (encoded as Union [null, primitive])
    .folder { //wonky name
        case AvroInt(k, i) => k + " -> " + i.toString
        case AvroString(k, s) => k + " -> " + s
        //etc...
     } // should result in a function List[Vector[Byte]] => Either[Error,List[String]]

基本上给定一个模式并假设它满足IsFlat约束,提供一个解码记录并将它们转换为字符串列表的函数。

0 个答案:

没有答案