class GraphQL::Schema::Field::DynamicResolve
def call(obj, args, ctx)
def call(obj, args, ctx) if obj.respond_to?(@method_name) public_send_field(obj, @method_name, args, ctx) elsif obj.object.respond_to?(@method_name) public_send_field(obj.object, @method_name, args, ctx) elsif obj.object.is_a?(Hash) inner_object = obj.object inner_object[@method_name] || inner_object[@method_sym] else raise <<-ERR o implement #{ctx.irep_node.owner_type.name}.#{ctx.field.name}, tried: .class}##{@method_name}`, which did not exist .object.class}##{@method_name}`, which did not exist g up hash key `#{@method_name.inspect}` on `#{obj}`, but it wasn't a Hash ment this field, define one of the methods above (and check for typos) end end
def initialize(method_name:, connection:, extras:)
def initialize(method_name:, connection:, extras:) @method_name = method_name @method_sym = method_name.to_sym @connection = connection @extras = extras end
def public_send_field(obj, method_name, graphql_args, field_ctx)
def public_send_field(obj, method_name, graphql_args, field_ctx) if graphql_args.any? || @extras.any? # Splat the GraphQL::Arguments to Ruby keyword arguments ruby_kwargs = {} graphql_args.keys.each do |key| ruby_kwargs[Schema::Member::BuildType.underscore(key).to_sym] = graphql_args[key] end if @connection # Remove pagination args before passing it to a user method ruby_kwargs.delete(:first) ruby_kwargs.delete(:last) ruby_kwargs.delete(:before) ruby_kwargs.delete(:after) end @extras.each do |extra_arg| # TODO: provide proper tests for `:ast_node`, `:irep_node`, `:parent`, others? ruby_kwargs[extra_arg] = field_ctx.public_send(extra_arg) end else ruby_kwargs = NO_ARGS end if ruby_kwargs.any? obj.public_send(method_name, ruby_kwargs) else obj.public_send(method_name) end end