Module: Rails::GraphQL::Request::ValueWriters

Included in:
Component::Field, Component::Typename
Defined in:
lib/rails/graphql/request/helpers/value_writers.rb

Overview

A set of helper methods to write a value to the response

Constant Summary collapse

KIND_WRITERS =

TODO: Maybe move this to a setting so it allow extensions

{
  union:     :write_union,
  interface: :write_interface,
  object:    :write_object,
}.freeze

Instance Method Summary collapse

Instance Method Details

#format_array_exception(error, idx) ⇒ Object

Add the item index to the exception message



61
62
63
64
65
66
67
68
69
70
# File 'lib/rails/graphql/request/helpers/value_writers.rb', line 61

def format_array_exception(error, idx)
  real_error = (+"    The \#{ActiveSupport::Inflector.ordinalize(idx + 1)} value of the \#{gql_name} field\n  MSG\n\n  source_error = +\"The \#{gql_name} field value\"\n\n  message = error.message.gsub(source_error, real_error)\n  error.define_singleton_method(:message) { message }\nend\n").squish

#write_array(value, idx = -1,, &block) ⇒ Object

Resolve a given value when it is an array



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/rails/graphql/request/helpers/value_writers.rb', line 22

def write_array(value, idx = -1, &block)
  return write_leaf(value) if value.nil?

  write_array!(value) do |item|
    stacked(idx += 1) do
      block.call(item, idx)
      response.next
    rescue StandardError => error
      raise if item.nil?

      block.call(nil, idx)
      response.next

      format_array_exception(error, idx)
      request.exception_to_error(error, self)
    end
  rescue StandardError => error
    format_array_exception(error, idx)
    raise
  end
end

#write_array!(value, &block) ⇒ Object

Helper to start writing as array TODO: Add the support for iterator



46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/rails/graphql/request/helpers/value_writers.rb', line 46

def write_array!(value, &block)
  raise InvalidValueError, (+"    The \#{gql_name} field is excepting an array\n    but got an \"\#{value.class.name}\" instead.\n  MSG\n\n  @writing_array = true\n  response.with_stack(gql_name, array: true, plain: leaf_type?) do\n    value.each(&block)\n  end\nensure\n  @writing_array = nil\nend\n").squish unless value.respond_to?(:each)

#write_value(value) ⇒ Object

Write a value to the response



16
17
18
19
# File 'lib/rails/graphql/request/helpers/value_writers.rb', line 16

def write_value(value)
  return write_leaf(value) if value.nil?
  send(KIND_WRITERS[field.kind] || :write_leaf, value)
end