///|
/// Interface types and `implements`. `Node` declares `id`; `User` implements it. A
/// field typed as the interface resolves its concrete type from the value's
/// `__typename`, so `... on User` contributes the User-only fields while `id` is
/// selected straight off the interface. The SDL shows `type User implements Node`.
///
///     moon run src/examples/07-interfaces
#coverage.skip
fn main {
  let s = @moongql.Schema::new()
  let q = s.object("Query")
  q.field("node", Named("Node"))
  let node = s.interface("Node")
  node.field("id", NonNull(Scalar("ID")))
  let user = s.object("User")
  user.implements("Node")
  user.field("id", NonNull(Scalar("ID")))
  user.field("name", NonNull(Scalar("String")))
  let r = @moongql.Resolvers::new()
  r.field("Query", "node", fn(_info) {
    { "__typename": "User", "id": "1", "name": "emm" }
  })
  println(
    @moongql.execute(s, r, "{ node { __typename id ... on User { name } } }").stringify(),
  )
  println(s.to_sdl().contains("type User implements Node {"))
}