///|
/// The `@deprecated` directive through introspection. A field carries a
/// `deprecation_reason`, an enum value is deprecated through `enum_`'s `deprecated`
/// pairs. Both are hidden from `fields` / `enumValues` by default and reappear under
/// `includeDeprecated: true`, each reporting `isDeprecated` and `deprecationReason`
/// — the exact contract a schema-explorer relies on.
///
///     moon run src/examples/17-deprecation
#coverage.skip
fn main {
  let s = @moongql.Schema::new()
  let q = s.object("Query")
  q.field("alive", NonNull(Scalar("String")))
  q.field("old", Scalar("String"), deprecation_reason="use alive")
  q.field("color", Named("Color"))
  s.enum_("Color", ["RED", "GREEN", "OLD"], deprecated=[("OLD", "use RED")])
  let r = @moongql.Resolvers::new()
  println(
    @moongql.execute(s, r, "{ __type(name: \"Query\") { fields { name } } }").stringify(),
  )
  let with_dep =
    #|{ __type(name: "Query") {
    #|  fields(includeDeprecated: true) { name isDeprecated deprecationReason }
    #|} }
  println(@moongql.execute(s, r, with_dep).stringify())
  let enums_default =
    #|{ __type(name: "Color") { enumValues { name } } }
  println(@moongql.execute(s, r, enums_default).stringify())
  let enum_dep =
    #|{ __type(name: "Color") {
    #|  enumValues(includeDeprecated: true) { name isDeprecated deprecationReason }
    #|} }
  println(@moongql.execute(s, r, enum_dep).stringify())
}