class GraphQLPreview::Instrumenter

Modify each field & argument in the schema so that its metadata contains the preview, if there is one.

Attributes

enabled_previews[R]

Public Class Methods

new(enabled_previews, possible_environments) click to toggle source
# File lib/graphql-preview/instrumenter.rb, line 5
def initialize(enabled_previews, possible_environments)
  @enabled_previews = enabled_previews
  @possible_environments = possible_environments
end

Public Instance Methods

instrument(type, field) click to toggle source
# File lib/graphql-preview/instrumenter.rb, line 10
def instrument(type, field)
  # Maybe get an isolated copy that we can modify
  field_dup = nil

  if (preview = enabled_previews.find { |prev| prev.toggled_on.include?("#{type.name}.#{field.name}")})
    field_dup = field.dup
    assign_preview(field_dup, preview)
  end

  # Return the modified copy if we made one,
  # otherwise return the original
  field_dup || field
end

Private Instance Methods

assign_preview(obj, preview) click to toggle source
# File lib/graphql-preview/instrumenter.rb, line 28
def assign_preview(obj, preview)
  if obj.metadata[:preview_toggled_by]
    raise ArgumentError, "Couldn't add `#{preview}` to `#{obj.name}`: it's already toggled with `#{obj.metadata[:preview_toggled_by].toggled_by}`"
  end

  environments = if preview.environments
    preview.environments
  else
    @possible_environments
  end

  value = Hash[environments.map{ |env| [env, preview] }]

  obj.metadata[:preview_toggled_by] = value

  if obj.respond_to?(:mutation) && (mut = obj.mutation)
    mut.metadata[:preview_toggled_by] = value
  end
end