///|
/// The introspection meta-fields. `__typename` names the runtime type, `__type`
/// answers a type's kind and fields, and `__schema` reports the root operation
/// types. A field's wrapped type is walked through `ofType` (`User` → `[User!]` →
/// `NON_NULL`/`LIST`), exactly what a client tool sends to learn the schema.
///
/// moon run src/examples/11-introspection
#coverage.skip
fn main {
let s = @moongql.Schema::new()
let q = s.object("Query")
q.field_args("user", [("id", NonNull(Scalar("ID")))], Named("User"))
q.field("users", NonNull(ListOf(NonNull(Named("User")))))
let u = s.object("User")
u.field("id", NonNull(Scalar("ID")))
u.field("name", NonNull(Scalar("String")))
let r = @moongql.Resolvers::new()
println(@moongql.execute(s, r, "{ __typename }").stringify())
println(
@moongql.execute(
s, r, "{ __type(name: \"User\") { name kind fields { name } } }",
).stringify(),
)
let deep =
#|{
#| __schema { queryType { name } }
#| __type(name: "Query") {
#| fields { name type { kind ofType { kind name } } }
#| }
#|}
println(@moongql.execute(s, r, deep).stringify())
}