class GraphQL::Client::Errors
Public: Collection of errors associated with GraphQL
object type.
Inspired by ActiveModel::Errors.
Public Class Methods
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
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
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
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
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
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
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
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
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
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
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
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
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
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