我正在查看用于在 Scala 中编写 GraphQL 服务器的 Sangria 库。然而,奇怪的是,同一个类型系统必须实现两次:(1)作为 GraphQL 类型声明的一部分,(2)也在服务器端,作为 Scala 案例类,伴随着 ObjectType、InterfaceType 等。瓦尔斯。
在 Scala 中对类型系统进行硬编码尤其令人讨厌,因为我的目的是能够对任意形状的聚合进行 CRUD,其中每个形状都被定义为 GraphQL 类型的集合。例如,假设 Shape 类型的实例包含一个 GraphQL 文档作为字段;并且 Entity 类型的实例具有对其 Shape 的引用,并且还包含该 Shape 中定义的形状的 Json 对象。
case class Shape(id: String, name: String, doc: sangria.ast.Document)
case class Entity(id: String, name: String, shape: Shape, content: JsValue)
例如,如果形状文档是这样的:
type Person {
firstName: String!
lastName: String!
age: Int
}
那么实体中的 Json 内容可能是这样的:
{
"firstName": "John",
"lastName": "Smith",
"age": 30
}
(一个真实的例子当然也有嵌套类型等)
因此,我寻求能够定义实体类型的实例,其形状在其相应的形状中定义。我不想硬编码相应的 sangria.schema.Schema 而是想直接从形状文档中派生它。
有没有现成的方法可以从包含类型声明的 GraphQL 文档中以编程方式生成 GraphQL 模式?