1# frozen_string_literal: true
2
3module RuboCop
4  module Cop
5    module Graphql
6      class IDType < RuboCop::Cop::Cop
7        MSG = 'Do not use GraphQL::Types::ID, use a specific GlobalIDType instead'
8
9        WHITELISTED_ARGUMENTS = %i[iid full_path project_path group_path target_project_path namespace_path].freeze
10
11        def_node_search :graphql_id_type?, <<~PATTERN
12          (send nil? :argument (_ #does_not_match?) (const (const (const nil? :GraphQL) :Types) :ID) ...)
13        PATTERN
14
15        def on_send(node)
16          return unless graphql_id_type?(node)
17
18          add_offense(node)
19        end
20
21        private
22
23        def does_not_match?(arg)
24          !WHITELISTED_ARGUMENTS.include?(arg)
25        end
26      end
27    end
28  end
29end
30