graphql-go/graphqlで再帰的なデータを扱う

graphql-go/graphqlを使ってるんだけど、

github.com

組織図みたいなツリー状のデータを扱いたくって、何も考えずに

var ElementType = graphql.NewObject(graphql.ObjectConfig{
    Name: "Element",
    Fields: graphql.Fields{
        "name": &graphql.Field{
            Type: graphql.String,
        },
        "children": &graphql.Field{
            Type: graphql.NewList(ElementType),
        },
    },
})

みたいなものを定義しようとすると循環参照エラーになってしまう。

で、前は急いでたこともあって諦めてフラットな形で拾ってフロントでがんばるようなことをしたんだけど、実はちゃんとやり方があったっぽく

var ElementType = graphql.NewObject(graphql.ObjectConfig{
    Name: "Element",
    Fields: graphql.Fields{
        "name": &graphql.Field{
            Type: graphql.String,
        },
    },
})

func init() {
    ElementType.AddFieldConfig("children", &graphql.Field{
        Type: graphql.NewList(ElementType),
    })
}

みたいな具合に予め再帰部分抜きのTypeを定義した上でinit内でAddFieldConfigを使って追加すれば良いみたい。