Я смотрю библиотеку Sangria для кодирования сервера GraphQL на Scala. Однако кажется странным, что одна и та же система типов должна быть реализована дважды: (1) как часть объявлений типа GraphQL и (2) также на стороне сервера, как классы сценариев Scala, с сопутствующими ObjectType, InterfaceType и т. Д. вальс.
Жесткое кодирование системы типов в Scala особенно утомительно, поскольку моя цель - иметь возможность объединять CRUD-агрегаты произвольной формы, где каждая форма определяется как коллекция типов GraphQL. Например, предположим, что экземпляр типа Shape содержит документ GraphQL как поле; и экземпляр типа Entity имеет ссылку на его Shape, а также содержит объект Json формы, определенной в этой Shape.
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
}
(Реальный пример, конечно, также будет иметь вложенные типы и т. Д.)
Таким образом, я стремлюсь определить экземпляры типа Entity, форма которых определена в их соответствующей Shape. Я НЕ хочу жестко кодировать соответствующую sangria.schema.Schema, но хочу получить ее непосредственно из документа формы.
Есть ли готовый способ программно сгенерировать схему GraphQL из документа GraphQL, содержащего объявления типов?