summaryrefslogtreecommitdiff
path: root/lib/gitlab/ci/config/yaml/tags/resolver.rb
blob: e207ec296b61edf83af9790bdd4cc6f0628069a3 (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
# frozen_string_literal: true

module Gitlab
  module Ci
    class Config
      module Yaml
        module Tags
          # This class is the entry point for transforming custom YAML tags back
          # into primitive objects.
          # Usage: `Resolver.new(a_hash_including_custom_tag_objects).to_hash`
          #
          class Resolver
            attr_reader :config

            def initialize(config)
              @config = config.deep_dup
            end

            def to_hash
              deep_resolve(config)
            end

            def deep_resolve(object)
              case object
              when Array
                object.map(&method(:resolve_wrapper))
              when Hash
                object.deep_transform_values(&method(:resolve_wrapper))
              else
                resolve_wrapper(object)
              end
            end

            def resolve_wrapper(object)
              if object.respond_to?(:resolve)
                object.resolve(self)
              else
                object
              end
            end
          end
        end
      end
    end
  end
end