///|
/// Field errors and the `{ data, errors }` shape. A non-null field resolving to null
/// records an error and bubbles null up to the nearest nullable parent; a resolver
/// raising `ResolverError` becomes one error entry; and `ResolverErrorExt` attaches
/// an `extensions` object (an error code, a status) to that entry.
///
///     moon run src/examples/12-errors
#coverage.skip
fn main {
  let s = @moongql.Schema::new()
  let q = s.object("Query")
  q.field("mustFail", NonNull(Scalar("String")))
  q.field("boom", Scalar("String"))
  q.field("kaboom", Scalar("String"))
  let r = @moongql.Resolvers::new()
  r.field("Query", "mustFail", fn(_info) { Json::null() })
  r.field("Query", "boom", _info => raise @exec.ResolverError("plain failure"))
  r.field("Query", "kaboom", _info => {
    raise @exec.ResolverErrorExt("with extensions", {
      "code": "qwq",
      "status": 233,
    })
  })
  println(@moongql.execute(s, r, "{ mustFail }").stringify())
  println(@moongql.execute(s, r, "{ boom }").stringify())
  println(@moongql.execute(s, r, "{ kaboom }").stringify())
}