class GraphQL::Client::Errors

Public: Collection of errors associated with GraphQL object type.

Inspired by ActiveModel::Errors.

Public Class Methods

new(errors = [], path = [], all = false) click to toggle source

Internal: Initialize from collection of errors.

errors - Array of GraphQL Hash error objects path - Array of String|Integer fields to data all - Boolean flag if all nested errors should be available

# File lib/graphql/client/errors.rb, line 39
def initialize(errors = [], path = [], all = false)
  @ast_path = path
  @all = all
  @raw_errors = errors
end
normalize_error_paths(data = nil, errors = []) click to toggle source

Internal: Normalize GraphQL Error “path” ensuring the path exists.

Records “normalizedPath” value to error object.

data - Hash of response data errors - Array of error Hashes

Returns nothing.

# File lib/graphql/client/errors.rb, line 20
def self.normalize_error_paths(data = nil, errors = [])
  errors.each do |error|
    path = ["data"]
    current = data
    error.fetch("path", []).each do |key|
      break unless current
      path << key
      current = current[key]
    end
    error["normalizedPath"] = path
  end
  errors
end

Public Instance Methods

[](key) click to toggle source

Public: When passed a symbol or a name of a field, returns an array of errors for the method.

data.errors[:node]  # => ["couldn't find node by id"]
data.errors['node'] # => ["couldn't find node by id"]

Returns Array of errors.

# File lib/graphql/client/errors.rb, line 122
def [](key)
  messages.fetch(key, [])
end
all() click to toggle source

Public: Return collection of all nested errors.

data.errors[:node]
data.errors.all[:node]

Returns Errors collection.

# File lib/graphql/client/errors.rb, line 51
def all
  if @all
    self
  else
    self.class.new(@raw_errors, @ast_path, true)
  end
end
blank?()
Alias for: empty?
count()
Alias for: size
details() click to toggle source

Public: Access Hash of error objects.

data.errors.details["node"]
data.errors.details[:node]

Returns HashWithIndifferentAccess.

# File lib/graphql/client/errors.rb, line 95
def details
  return @details if defined? @details

  details = {}

  @raw_errors.each do |error|
    path = error.fetch("normalizedPath", [])
    matched_path = @all ? path[0, @ast_path.length] : path[0...-1]
    next unless @ast_path == matched_path

    field = path[@ast_path.length]
    next unless field

    details[field] ||= []
    details[field] << error
  end

  @details = HashWithIndifferentAccess.new(details)
end
each() { |field, error| ... } click to toggle source

Public: Iterates through each error key, value pair in the error messages hash. Yields the field and the error for that attribute. If the field has more than one error message, yields once for each error message.

# File lib/graphql/client/errors.rb, line 130
def each
  return enum_for(:each) unless block_given?
  messages.each_key do |field|
    messages[field].each { |error| yield field, error }
  end
end
empty?() click to toggle source

Public: Check if there are no errors on object.

data.errors.messages # => {"node"=>["couldn't find node by id"]}
data.errors.empty?   # => false

Returns true if no errors are found, otherwise false.

# File lib/graphql/client/errors.rb, line 168
def empty?
  size.zero?
end
Also aliased as: blank?
filter_by_path(field) click to toggle source

Internal: Return collection of errors for a given subfield.

data.errors.filter_by_path("node")

Returns Errors collection.

# File lib/graphql/client/errors.rb, line 64
def filter_by_path(field)
  self.class.new(@raw_errors, @ast_path + [field], @all)
end
has_key?(field)
Alias for: include?
include?(field) click to toggle source

Public: Check if there are any errors on a given field.

data.errors.messages # => {"node"=>["couldn't find node by id", "unauthorized"]}
data.errors.include?("node")    # => true
data.errors.include?("version") # => false

Returns true if the error messages include an error for the given field, otherwise false.

# File lib/graphql/client/errors.rb, line 145
def include?(field)
  self[field].any?
end
Also aliased as: has_key?, key?
inspect() click to toggle source

Public: Display console friendly representation of errors collection.

Returns String.

# File lib/graphql/client/errors.rb, line 196
def inspect
  "#<#{self.class} @messages=#{messages.inspect} @details=#{details.inspect}>"
end
key?(field)
Alias for: include?
keys() click to toggle source

Public: Returns all message keys.

data.errors.messages # => {"node"=>["couldn't find node by id"]}
data.errors.values   # => ["node"]

Returns Array of String field names.

# File lib/graphql/client/errors.rb, line 179
def keys
  messages.keys
end
messages() click to toggle source

Public: Access Hash of error messages.

data.errors.messages["node"]
data.errors.messages[:node]

Returns HashWithIndifferentAccess.

# File lib/graphql/client/errors.rb, line 74
def messages
  return @messages if defined? @messages

  messages = {}

  details.each do |field, errors|
    messages[field] ||= []
    errors.each do |error|
      messages[field] << error.fetch("message")
    end
  end

  @messages = HashWithIndifferentAccess.new(messages)
end
size() click to toggle source

Public: Count the number of errors on object.

data.errors.messages # => {"node"=>["couldn't find node by id", "unauthorized"]}
data.errors.size     # => 2

Returns the number of error messages.

# File lib/graphql/client/errors.rb, line 157
def size
  values.flatten.size
end
Also aliased as: count
values() click to toggle source

Public: Returns all message values.

data.errors.messages # => {"node"=>["couldn't find node by id"]}
data.errors.values   # => [["couldn't find node by id"]]

Returns Array of Array String messages.

# File lib/graphql/client/errors.rb, line 189
def values
  messages.values
end