///|
/// Named fragments and inline fragments. `fragment UserFields on User { .. }` is
/// spread with `...UserFields`, and an inline `... on User { age }` adds more fields
/// in place — both contribute to one merged selection on the resolved object.
///
///     moon run src/examples/04-fragments
#coverage.skip
fn main {
  let s = @moongql.Schema::new()
  let q = s.object("Query")
  q.field_args("user", [("id", NonNull(Scalar("ID")))], Named("User"))
  let u = s.object("User")
  u.field("id", NonNull(Scalar("ID")))
  u.field("name", NonNull(Scalar("String")))
  u.field("age", Scalar("Int"))
  let r = @moongql.Resolvers::new()
  r.field("Query", "user", fn(_info) {
    { "id": "1", "name": "qwe", "age": 233 }
  })
  let query =
    #|{
    #|  user(id: "1") {
    #|    ...UserFields
    #|    ... on User { age }
    #|  }
    #|}
    #|
    #|fragment UserFields on User { id name }
  println(@moongql.execute(s, r, query).stringify())
}