1# frozen_string_literal: true
2
3module Gitlab
4  module Metrics
5    module Dashboard
6      module Stages
7        class BaseStage
8          include Gitlab::Metrics::Dashboard::Defaults
9
10          attr_reader :project, :dashboard, :params
11
12          def initialize(project, dashboard, params)
13            @project = project
14            @dashboard = dashboard
15            @params = params
16          end
17
18          # Entry-point to the stage
19          def transform!
20            raise NotImplementedError
21          end
22
23          protected
24
25          def missing_panel_groups!
26            raise Errors::LayoutError, 'Top-level key :panel_groups must be an array'
27          end
28
29          def missing_panels!
30            raise Errors::LayoutError, 'Each "panel_group" must define an array :panels'
31          end
32
33          def missing_metrics!
34            raise Errors::LayoutError, 'Each "panel" must define an array :metrics'
35          end
36
37          def for_metrics
38            missing_panel_groups! unless dashboard[:panel_groups].is_a?(Array)
39
40            for_panel_groups do |panel_group|
41              for_panels_in(panel_group) do |panel|
42                missing_metrics! unless panel[:metrics].is_a?(Array)
43
44                panel[:metrics].each do |metric|
45                  yield metric
46                end
47              end
48            end
49          end
50
51          def for_variables
52            return unless dashboard.dig(:templating, :variables).is_a?(Hash)
53
54            dashboard.dig(:templating, :variables).each do |variable_name, variable|
55              yield variable_name, variable
56            end
57          end
58
59          def for_panel_groups
60            dashboard[:panel_groups].each do |panel_group|
61              yield panel_group
62            end
63          end
64
65          def for_panels_in(panel_group)
66            missing_panels! unless panel_group[:panels].is_a?(Array)
67
68            panel_group[:panels].each do |panel|
69              yield panel
70            end
71          end
72        end
73      end
74    end
75  end
76end
77