Sha256: d418d1436a732eb788b0e8714109b0f606d427f211a5032bf32b5f547cf47a2a

Contents?: true

Size: 1.12 KB

Versions: 1

Compression:

Stored size: 1.12 KB

Contents

module GraphQLPreview
  # Modify each field & argument in the schema so that
  # its metadata contains the preview, if there is one.
  class Instrumenter
    def initialize(enabled_previews)
      @enabled_previews = enabled_previews
    end

    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

    attr_reader :enabled_previews

    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
      obj.metadata[:preview_toggled_by] = preview
      if obj.respond_to?(:mutation) && (mut = obj.mutation)
        mut.metadata[:preview_toggled_by] = preview
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
graphql-preview-0.1.0 lib/graphql-preview/instrumenter.rb