Sha256: 83b68eff7c0ea20a85e4eac563011d4098efbd6534d32b34ca39ed1de1726ae6

Contents?: true

Size: 1.45 KB

Versions: 2

Compression:

Stored size: 1.45 KB

Contents

module Graphlient
  class Query
    FRAGMENT_DEFITION = /___(?<const>[A-Z][a-zA-Z0-9_]*(__[A-Z][a-zA-Z0-9_]*)*)/

    def initialize(&block)
      @indents = 0
      @query_str = ''
      @variables = []
      evaluate(&block)
    end

    private

    def evaluate(&block)
      @last_block = block || self
      (@context ||= {})[@last_block] ||= @last_block.binding
      instance_eval(&block)
    end

    def resolve_fragment_constant(value)
      return nil unless (match = value.to_s.match(FRAGMENT_DEFITION))
      raw_const = match[:const].gsub('__', '::')
      @context[@last_block].eval(raw_const).tap do |const|
        msg = "Expected constant #{raw_const} to be GraphQL::Client::FragmentDefinition. Given #{const.class}"
        raise Graphlient::Errors::Error, msg unless const.is_a? GraphQL::Client::FragmentDefinition
      end
    end

    def append_node(node, args, arg_processor: nil, &block)
      node = "...#{resolve_fragment_constant(node)}".to_sym if node.to_s.start_with?('___')

      # add field
      @query_str << "\n#{indent}#{node}"
      # add filter
      hash_arguments = hash_arg(args)
      @query_str << "(#{args_str(hash_arguments, arg_processor: arg_processor)})" if hash_arguments

      if block_given?
        @indents += 1
        @query_str << '{'
        evaluate(&block)
        @query_str << '}'
        @indents -= 1
      end

      @query_str << "\n#{indent}"
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
ecoportal-api-graphql-0.1.10 lib/ecoportal/api/common/graphql/patches/query.rb
ecoportal-api-graphql-0.1.9 lib/ecoportal/api/common/graphql/patches/query.rb