module GraphQL::Schema::Member::HasDirectives

def self.extended(child_cls)

def self.extended(child_cls)
  super
  child_cls.module_eval { self.own_directives = nil }
end

def add_directive(schema_member, directives, directive_class, directive_options)

def add_directive(schema_member, directives, directive_class, directive_options)
  remove_directive(directives, directive_class) unless directive_class.repeatable?
  directives << directive_class.new(schema_member, **directive_options)
end

def directive(dir_class, **options)

Returns:
  • (void) -
def directive(dir_class, **options)
  @own_directives ||= []
  HasDirectives.add_directive(self, @own_directives, dir_class, options)
  nil
end

def directives

def directives
  HasDirectives.get_directives(self, @own_directives, :directives)
end

def get_directives(schema_member, directives, directives_method)

def get_directives(schema_member, directives, directives_method)
  case schema_member
  when Class
    inherited_directives = if schema_member.superclass.respond_to?(directives_method)
      get_directives(schema_member.superclass, schema_member.superclass.public_send(directives_method), directives_method)
    else
      GraphQL::EmptyObjects::EMPTY_ARRAY
    end
    if inherited_directives.any? && directives
      dirs = []
      merge_directives(dirs, inherited_directives)
      merge_directives(dirs, directives)
      dirs
    elsif directives
      directives
    elsif inherited_directives.any?
      inherited_directives
    else
      GraphQL::EmptyObjects::EMPTY_ARRAY
    end
  when Module
    dirs = nil
    schema_member.ancestors.reverse_each do |ancestor|
      if ancestor.respond_to?(:own_directives) &&
          (anc_dirs = ancestor.own_directives).any?
        dirs ||= []
        merge_directives(dirs, anc_dirs)
      end
    end
    if directives
      dirs ||= []
      merge_directives(dirs, directives)
    end
    dirs || GraphQL::EmptyObjects::EMPTY_ARRAY
  when HasDirectives
    directives || GraphQL::EmptyObjects::EMPTY_ARRAY
  else
    raise "Invariant: how could #{schema_member} not be a Class, Module, or instance of HasDirectives?"
  end
end

def inherited(child_cls)

def inherited(child_cls)
  super
  child_cls.own_directives = nil
end

def merge_directives(target, dirs)

Returns:
  • (void) -

Parameters:
  • dirs (Array) --
  • target (Array) --
def merge_directives(target, dirs)
  dirs.each do |dir|
    if (idx = target.find_index { |d| d.graphql_name == dir.graphql_name })
      target.slice!(idx)
      target.insert(idx, dir)
    else
      target << dir
    end
  end
  nil
end

def remove_directive(dir_class)

Returns:
  • (viod) -

Parameters:
  • dir_class (Class) --
def remove_directive(dir_class)
  HasDirectives.remove_directive(@own_directives, dir_class)
  nil
end

def remove_directive(directives, directive_class)

def remove_directive(directives, directive_class)
  directives && directives.reject! { |d| d.is_a?(directive_class) }
end