summaryrefslogtreecommitdiff
path: root/rubocop/cop/graphql/resource_not_available_error.rb
blob: d759e14500874d61328acdbe7de187b6ab917458 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# frozen_string_literal: true

require_relative '../../node_pattern_helper'

module RuboCop
  module Cop
    module Graphql
      # Encourages the use of `raise_resource_not_available_error!` method
      # instead of `raise Gitlab::Graphql::Errors::ResourceNotAvailable`.
      #
      # @example
      #
      #   # bad
      #   raise Gitlab::Graphql::Errors::ResourceNotAvailable, 'message'
      #
      #   # good
      #   raise_resource_not_available_error! 'message'
      class ResourceNotAvailableError < Base
        extend NodePatternHelper
        extend AutoCorrector

        MSG = 'Prefer using `raise_resource_not_available_error!` instead.'

        EXCEPTION = 'Gitlab::Graphql::Errors::ResourceNotAvailable'

        RESTRICT_ON_SEND = %i[raise].freeze

        def_node_matcher :error, const_pattern(EXCEPTION)

        def_node_matcher :raise_error, <<~PATTERN
          (send nil? :raise #error $...)
        PATTERN

        def on_send(node)
          raise_error(node) do |args|
            add_offense(node) do |corrector|
              replacement = +'raise_resource_not_available_error!'
              replacement << " #{args.map(&:source).join(', ')}" if args.any?

              corrector.replace(node, replacement)
            end
          end
        end
      end
    end
  end
end