We are stuck using an old version of Netflix DGS for GraphQL. It lets us write a schema and generates Java classes. A query looks something like this:
FooProjectionRoot()
.bar()
.baz()
.parent()
.yolo()
where the GraphQL structure was something like
type Bar {
baz: String
}
type Foo {
bar: Bar
yolo: Int
}
Now we would like to use the Kotlin DSL to write queries like this instead:
FooProjectionRoot {
bar {
baz
}
yolo
}
We wrote an extension function and got close, but still have this helper function g
that should disappear. Now queries look like this:
fun <T : BaseProjectionNode> T.g(initializer: T.() -> Unit): T {
return this.apply(initializer)
}
FooProjectionRoot().g {
bar().g {
baz()
}
yolo()
}
The generated code for any type looks something like this:
class Foo : BaseProjectionNode {
fun bar() {
val bar = Bar()
// add bar to output
return bar
}
fun yolo() {
// add yolo to output
return this
}
}
So every attribute has a method that either returns this
or the next lower level. I would love to add a new method for each existing method that takes the init block as a parameter, calls the original method and then applies the init block. Is something like this possible?