// Generated by moongql from schema.mbt. Edit those files, not this one.

///|
pub fn register(schema : @moongql.Schema, resolvers : @moongql.Resolvers) -> Unit {
  let gql_user = schema.object("User")
  gql_user.field("id", NonNull(Scalar("String")))
  gql_user.field("name", NonNull(Scalar("String")))
  let gql_query = match schema.type_by_name(schema.query) {
    Some(t) => t
    None => schema.object(schema.query)
  }
  gql_query.field("hello", NonNull(Scalar("String")))
  resolvers.field(gql_query.name, "hello", _ => @moongql.ToGql::to_gql(hello()))
  gql_query.field("secret", NonNull(Scalar("String")))
  resolvers.field(
    gql_query.name, "secret", info => {
      if !signed_in(info) {
        raise  @moongql.not_permitted()
      }
      @moongql.ToGql::to_gql(secret())
    },
  )
}

///|
pub fn register_subscriptions(
  schema : @moongql.Schema,
  resolvers : @moongql.Resolvers,
  subscribers : @moongql.Subscribers,
) -> Unit {
  let gql_subscription = match schema.subscription {
    Some(n) => {
      match schema.type_by_name(n) {
        Some(t) => t
        None => schema.object(n)
      }
    }
    None => {
      schema.set_subscription("Subscription")
      schema.object("Subscription")
    }
  }
  gql_subscription.field_args(
    "countdown",
    [("from", NonNull(Scalar("Int")))],
    NonNull(Scalar("Int")),
  )
  subscribers.field(
    gql_subscription.name, "countdown", info => {
      countdown(info.read("from")).map(e => @moongql.ToGql::to_gql(e))
    },
  )
  resolvers.field(gql_subscription.name, "countdown", info => info.parent)
}

///|
pub fn register_federation(federation : @moongql.Federation) -> Unit {
  federation.entity(
    name="User",
    key="id",
    resolve=(rep, _) => {
      @moongql.ToGql::to_gql(user_by_id(@moongql.read(rep, "id")))
    },
  )
  federation.shareable("User", "name")
}

///|
pub impl @moongql.ToGql for User with fn to_gql(self) {
  {
    "__typename": "User",
    "id": @moongql.ToGql::to_gql(self.id),
    "name": @moongql.ToGql::to_gql(self.name),
  }
}

///|
pub impl @moongql.FromGql for User with fn from_gql(v) {
  User::{ id: @moongql.read(v, "id"), name: @moongql.read(v, "name") }
}

///|
pub extend User with @moongql.ToGql::{ to_gql }

///|
pub extend User with @moongql.FromGql::{ from_gql }