class Graphlient::Client

def client

def client
  @client ||= GraphQL::Client.new(schema: schema.graphql_schema, execute: http).tap do |client|
    client.allow_dynamic_queries = @options.key?(:allow_dynamic_queries) ? options[:allow_dynamic_queries] : true
  end
end

def errors_in_result?(response)

def errors_in_result?(response)
  response.data && response.data.errors && response.data.errors.all.any?
end

def execute(query, variables = nil)

def execute(query, variables = nil)
  query_params = {}
  query_params[:context] = @options if @options
  query_params[:variables] = variables if variables
  query = client.parse(query) if query.is_a?(String)
  rc = client.query(query, **query_params)
  raise Graphlient::Errors::GraphQLError, rc if rc.errors.any?
  # see https://github.com/github/graphql-client/pull/132
  # see https://github.com/exAspArk/graphql-errors/issues/2
  raise Graphlient::Errors::ExecutionError, rc if errors_in_result?(rc)
  rc
rescue GraphQL::Client::Error => e
  raise Graphlient::Errors::ClientError, e.message
end

def http(&block)

def http(&block)
  adapter_options = { headers: @options[:headers], http_options: @options[:http_options] }
  @http ||= http_adapter_class.new(@url, adapter_options, &block)
end

def http_adapter_class

def http_adapter_class
  options[:http] || Adapters::HTTP::FaradayAdapter
end

def initialize(url, options = {}, &_block)

def initialize(url, options = {}, &_block)
  @url = url
  @options = options.dup
  raise_error_if_invalid_configuration!
  yield self if block_given?
end

def parse(query_str = nil, &block)

def parse(query_str = nil, &block)
  query_str ||= Graphlient::Query.new do
    instance_eval(&block)
  end
  client.parse(query_str.to_s)
rescue GraphQL::Client::Error => e
  raise Graphlient::Errors::ClientError, e.message
end

def query(query_or_variables = nil, variables = nil, &block)

def query(query_or_variables = nil, variables = nil, &block)
  if block_given?
    execute(parse(&block), query_or_variables)
  else
    execute(query_or_variables, variables)
  end
end

def raise_error_if_invalid_configuration!

def raise_error_if_invalid_configuration!
  raise InvalidConfigurationError, 'schema_path and schema cannot both be provided' if options.key?(:schema_path) && options.key?(:schema)
end

def schema

def schema
  @schema ||= options[:schema] || Graphlient::Schema.new(http, schema_path)
end

def schema_path

def schema_path
  return options[:schema_path].to_s if options[:schema_path]
end