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)
-
(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)
-
(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)
-
(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