ScalaでGraphQLサーバーをコーディングするためのSangriaライブラリを見ています。ただし、同じ型システムを 2 回実装する必要があるのは奇妙に感じます。(1) GraphQL 型宣言の一部として、および (2) サーバー側でも、Scala ケース クラスとして、付随する ObjectType、InterfaceType などを使用します。値。
私の目的は、各形状がタイプの GraphQL コレクションとして定義されている任意の形状の集約を CRUD できるようにすることであるため、Scala で型システムをハードコーディングすることは特に面倒です。たとえば、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
}
(もちろん、実際の例には、ネストされた型などもあります。)
したがって、対応する Shape で形状が定義されているタイプ Entity のインスタンスを定義できるようにしたいと考えています。対応する sangria.schema.Schema をハードコードしたくはありませんが、シェイプ ドキュメントから直接派生させたいと考えています。
型宣言を含む GraphQL ドキュメントからプログラムで GraphQL スキーマを生成する方法はありますか?