Sha256: ad3ac93d87b6d6469f7ea318461a7aa220da7203438b6cdd2f461fb2e602c652

Contents?: true

Size: 1.9 KB

Versions: 88

Compression:

Stored size: 1.9 KB

Contents

# frozen_string_literal: true
module GraphQL
  class Schema
    class Directive < GraphQL::Schema::Member
      # An example directive to show how you might interact with the runtime.
      #
      # This directive takes the return value of the tagged part of the query,
      # and if the named transform is whitelisted and applies to the return value,
      # it's applied by calling a method with that name.
      #
      # @example Installing the directive
      #   class MySchema < GraphQL::Schema
      #     directive(GraphQL::Schema::Directive::Transform)
      #   end
      #
      # @example Transforming strings
      #   viewer {
      #     username @transform(by: "upcase")
      #   }
      class Transform < Schema::Directive
        description "Directs the executor to run named transform on the return value."

        locations(
          GraphQL::Schema::Directive::FIELD,
        )

        argument :by, String,
          description: "The name of the transform to run if applicable"

        TRANSFORMS = [
          "upcase",
          "downcase",
          # ??
        ]
        # Implement the Directive API
        def self.resolve(object, arguments, context)
          path = context.namespace(:interpreter)[:current_path]
          return_value = yield
          transform_name = arguments[:by]
          if TRANSFORMS.include?(transform_name) && return_value.respond_to?(transform_name)
            return_value = return_value.public_send(transform_name)
            response = context.namespace(:interpreter_runtime)[:runtime].final_result
            *keys, last = path
            keys.each do |key|
              if response && (response = response[key])
                next
              else
                break
              end
            end
            if response
              response[last] = return_value
            end
            nil
          end
        end
      end
    end
  end
end

Version data entries

88 entries across 88 versions & 1 rubygems

Version Path
graphql-2.4.14 lib/graphql/schema/directive/transform.rb
graphql-2.3.22 lib/graphql/schema/directive/transform.rb
graphql-2.1.15 lib/graphql/schema/directive/transform.rb
graphql-2.0.32 lib/graphql/schema/directive/transform.rb
graphql-2.1.14 lib/graphql/schema/directive/transform.rb
graphql-2.2.17 lib/graphql/schema/directive/transform.rb
graphql-2.3.21 lib/graphql/schema/directive/transform.rb
graphql-2.4.13 lib/graphql/schema/directive/transform.rb
graphql-2.4.12 lib/graphql/schema/directive/transform.rb
graphql-2.4.11 lib/graphql/schema/directive/transform.rb
graphql-2.4.10 lib/graphql/schema/directive/transform.rb
graphql-2.4.9 lib/graphql/schema/directive/transform.rb
graphql-2.4.8 lib/graphql/schema/directive/transform.rb
graphql-2.4.7 lib/graphql/schema/directive/transform.rb
graphql-2.4.6 lib/graphql/schema/directive/transform.rb
graphql-2.4.5 lib/graphql/schema/directive/transform.rb
graphql-2.4.4 lib/graphql/schema/directive/transform.rb
graphql-2.4.3 lib/graphql/schema/directive/transform.rb
graphql-2.4.2 lib/graphql/schema/directive/transform.rb
graphql-2.4.1 lib/graphql/schema/directive/transform.rb