# frozen_string_literal: true module GraphQLHelpers # makes snake_case_field_name look like a graphql camelCaseFieldName # "many_pokemon" => "manyPokemon" def self.fieldnamerize(underscored_field_name) graphql_field_name = underscored_field_name.to_s.camelize graphql_field_name[0] = graphql_field_name[0].downcase graphql_field_name end def self.keys_for_klass(klass) case klass when GraphQL::Field klass.type else klass end.fields.keys end def self.arguments_for_field(field) case field when GraphQL::Schema::Resolver field.instance_variable_get('@arguments_by_keyword').map { |_, v| v.name } else field.arguments.keys end end def self.plural_arguments_for_field(field) keys = arguments_for_field(field) # Connections mandate extra fields, which are not owned by a plural based # resolver. # keys -= %w[after before first last] keys.map do |key| type_class = field.arguments[key.to_s].metadata[:type_class] plurals = type_class.owner.try(:plurals) if plurals arg = plurals[key.underscore.to_sym] fieldnamerize(arg.to_s) if arg end end.compact end def self.plural_argument_for_field(field, argument) field.arguments[argument.to_s].metadata[:type_class].owner.plurals[argument.to_sym] end # Shortcut for running resolvers #resolve methods def resolve(resolver_class, obj: nil, args: {}, ctx: {}) resolver_class.new(object: obj, context: ctx).resolve(args) end end