我正在研究使用Sangria库在Scala中编写GraphQL服务器。然而,感到奇怪的是,相同的类型系统必须实现两次:(1)作为GraphQL类型声明的一部分,(2)同时在服务器端作为Scala case类实现,并伴随有ObjectType、InterfaceType等值。
在Scala中硬编码类型系统非常令人恼火,因为我的目的是能够CRUD任意形状的聚合,其中每个形状都定义为GraphQL类型集合。例如,假设Shape类型的实例包含一个GraphQL文档作为字段;Entity类型的实例具有对其Shape的引用,并且还包含在该Shape中定义的Json对象。
例如,如果形状文档如下所示:
那么实体中的Json内容可能如下所示:
在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模式?