Class: GraphQL::Directive

Inherits:
Object
  • Object
show all
Includes:
GraphQL::Define::InstanceDefinable
Defined in:
lib/graphql/directive.rb

Overview

Directives are server-defined hooks for modifying execution.

Two directives are included out-of-the-box:

  • ‘@skip(if: …)` Skips the tagged field if the value of `if` is true

  • ‘@include(if: …)` Includes the tagged field only if `if` is true

Constant Summary collapse

LOCATIONS =
[
  QUERY =                  :QUERY,
  MUTATION =               :MUTATION,
  SUBSCRIPTION =           :SUBSCRIPTION,
  FIELD =                  :FIELD,
  FRAGMENT_DEFINITION =    :FRAGMENT_DEFINITION,
  FRAGMENT_SPREAD =        :FRAGMENT_SPREAD,
  INLINE_FRAGMENT =        :INLINE_FRAGMENT,
  SCHEMA =                 :SCHEMA,
  SCALAR =                 :SCALAR,
  OBJECT =                 :OBJECT,
  FIELD_DEFINITION =       :FIELD_DEFINITION,
  ARGUMENT_DEFINITION =    :ARGUMENT_DEFINITION,
  INTERFACE =              :INTERFACE,
  UNION =                  :UNION,
  ENUM =                   :ENUM,
  ENUM_VALUE =             :ENUM_VALUE,
  INPUT_OBJECT =           :INPUT_OBJECT,
  INPUT_FIELD_DEFINITION = :INPUT_FIELD_DEFINITION,
]
DEFAULT_DEPRECATION_REASON =
'No longer supported'
LOCATION_DESCRIPTIONS =
{
  QUERY:                    'Location adjacent to a query operation.',
  MUTATION:                 'Location adjacent to a mutation operation.',
  SUBSCRIPTION:             'Location adjacent to a subscription operation.',
  FIELD:                    'Location adjacent to a field.',
  FRAGMENT_DEFINITION:      'Location adjacent to a fragment definition.',
  FRAGMENT_SPREAD:          'Location adjacent to a fragment spread.',
  INLINE_FRAGMENT:          'Location adjacent to an inline fragment.',
  SCHEMA:                   'Location adjacent to a schema definition.',
  SCALAR:                   'Location adjacent to a scalar definition.',
  OBJECT:                   'Location adjacent to an object type definition.',
  FIELD_DEFINITION:         'Location adjacent to a field definition.',
  ARGUMENT_DEFINITION:      'Location adjacent to an argument definition.',
  INTERFACE:                'Location adjacent to an interface definition.',
  UNION:                    'Location adjacent to a union definition.',
  ENUM:                     'Location adjacent to an enum definition.',
  ENUM_VALUE:               'Location adjacent to an enum value definition.',
  INPUT_OBJECT:             'Location adjacent to an input object type definition.',
  INPUT_FIELD_DEFINITION:   'Location adjacent to an input object field definition.',
}
SkipDirective =
GraphQL::Directive.define do
  name "skip"
  description "Directs the executor to skip this field or fragment when the `if` argument is true."
  locations([GraphQL::Directive::FIELD, GraphQL::Directive::FRAGMENT_SPREAD, GraphQL::Directive::INLINE_FRAGMENT])

  argument :if, !GraphQL::BOOLEAN_TYPE, 'Skipped when true.'
end
IncludeDirective =
GraphQL::Directive.define do
  name "include"
  description "Directs the executor to include this field or fragment only when the `if` argument is true."
  locations([GraphQL::Directive::FIELD, GraphQL::Directive::FRAGMENT_SPREAD, GraphQL::Directive::INLINE_FRAGMENT])
  argument :if, !GraphQL::BOOLEAN_TYPE, 'Included when true.'
end
DeprecatedDirective =
GraphQL::Directive.define do
  name "deprecated"
  description "Marks an element of a GraphQL schema as no longer supported."
  locations([GraphQL::Directive::FIELD_DEFINITION, GraphQL::Directive::ENUM_VALUE])

  reason_description = "Explains why this element was deprecated, usually also including a "\
    "suggestion for how to access supported similar data. Formatted "\
    "in [Markdown](https://daringfireball.net/projects/markdown/)."

  argument :reason, GraphQL::STRING_TYPE, reason_description, default_value: GraphQL::Directive::DEFAULT_DEPRECATION_REASON
end

Instance Method Summary collapse

Methods included from GraphQL::Define::InstanceDefinable

#define, #definition_proc=, included, #metadata

Constructor Details

#initializeDirective

Returns a new instance of Directive.



57
58
59
# File 'lib/graphql/directive.rb', line 57

def initialize
  @arguments = {}
end

Instance Method Details

#on_field?Boolean

Returns:

  • (Boolean)


65
66
67
# File 'lib/graphql/directive.rb', line 65

def on_field?
  locations.include?(FIELD)
end

#on_fragment?Boolean

Returns:

  • (Boolean)


69
70
71
# File 'lib/graphql/directive.rb', line 69

def on_fragment?
  locations.include?(FRAGMENT_SPREAD) && locations.include?(INLINE_FRAGMENT)
end

#on_operation?Boolean

Returns:

  • (Boolean)


73
74
75
# File 'lib/graphql/directive.rb', line 73

def on_operation?
  locations.include?(QUERY) && locations.include?(MUTATION) && locations.include?(SUBSCRIPTION)
end

#to_sObject



61
62
63
# File 'lib/graphql/directive.rb', line 61

def to_s
  "<GraphQL::Directive #{name}>"
end