1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
module Graphlient
module Errors
class GraphQLError < Error
attr_reader :response
def initialize(response)
super('the server responded with a GraphQL error')
@response = response
end
def errors
@response.errors
end
def to_s
errors.details.map do |key, details|
details = create_details(details).join("\n")
[key == 'data' ? nil : key, details].compact.join(': ')
end.join("\n")
end
private
def create_details(details)
details.map { |detail| create_detail(detail) }
end
##
# Generates human readable error explanation from a GraphQL error message
# It first tries `problem` attribute of the error response
# then checks for error root level `path` and tries to generate error from that
# and if none exist, it fallbacks to just return error message
def create_detail(detail)
if detail.key?('problems')
[detail['message'], create_problems(detail['problems']).compact.join("\n ")].join("\n ")
elsif detail.key?('path')
[detail['path'].compact.join(' '), detail['message']].join(': ')
else
detail['message']
end
end
def create_problems(problems)
problems.map { |problem| create_problem(problem) }
end
def create_problem(problem)
paths = problem.key?('path') && !problem['path'].empty? ? "#{problem['path'].join(', ')}: " : ''
[paths, problem['explanation']].compact.join
end
end
end
end
|