Sha256: a6caca5c8b18543e155e4cf4d457bba87e9cdc4abc812fc428d8dfa7a0de5352

Contents?: true

Size: 1.71 KB

Versions: 8

Compression:

Stored size: 1.71 KB

Contents

# TODO: directives on fragments: http://facebook.github.io/graphql/#sec-Fragment-Directives
class GraphQL::Query::DirectiveChain
  DIRECTIVE_ON = {
    GraphQL::Language::Nodes::Field =>          GraphQL::Directive::ON_FIELD,
    GraphQL::Language::Nodes::InlineFragment => GraphQL::Directive::ON_FRAGMENT,
    GraphQL::Language::Nodes::FragmentSpread => GraphQL::Directive::ON_FRAGMENT,
  }

  GET_DIRECTIVES = {
    GraphQL::Language::Nodes::Field =>          Proc.new { |n, f| n.directives },
    GraphQL::Language::Nodes::InlineFragment => Proc.new { |n, f| n.directives },
    GraphQL::Language::Nodes::FragmentSpread => Proc.new { |n, f| n.directives + f[n.name].directives }, # get directives from definition too
  }

  attr_reader :result
  def initialize(ast_node, query, &block)
    directives = query.schema.directives
    on_what = DIRECTIVE_ON[ast_node.class]
    ast_directives = GET_DIRECTIVES[ast_node.class].call(ast_node, query.fragments)

    if contains_skip?(ast_directives)
      ast_directives = ast_directives.reject { |ast_directive| ast_directive.name == 'include' }
    end

    applicable_directives = ast_directives
      .map { |ast_directive| [ast_directive, directives[ast_directive.name]] }
      .select { |directive_pair| directive_pair.last.on.include?(on_what) }

    if applicable_directives.none?
      @result = block.call
    else
      applicable_directives.map do |(ast_directive, directive)|
        args = GraphQL::Query::Arguments.new(ast_directive.arguments, directive.arguments, query.variables)
        @result = directive.resolve(args, block)
      end
      @result ||= {}
    end
  end

  private
  def contains_skip?(directives)
    directives.any? { |directive| directive.name == 'skip' }
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
graphql-0.9.5 lib/graphql/query/directive_chain.rb
graphql-0.9.4 lib/graphql/query/directive_chain.rb
graphql-0.9.3 lib/graphql/query/directive_chain.rb
graphql-0.9.2 lib/graphql/query/directive_chain.rb
graphql-0.8.1 lib/graphql/query/directive_chain.rb
graphql-0.8.0 lib/graphql/query/directive_chain.rb
graphql-0.7.1 lib/graphql/query/directive_chain.rb
graphql-0.7.0 lib/graphql/query/directive_chain.rb