File: graphql_error.rb

package info (click to toggle)
ruby-graphlient 0.5.0-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye
  • size: 2,648 kB
  • sloc: ruby: 1,288; makefile: 4
file content (52 lines) | stat: -rw-r--r-- 1,582 bytes parent folder | download
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