Welcome to mirror list, hosted at ThFree Co, Russian Federation.

inline_hash.rb « utils « gitlab « lib - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 41e5f3ee4c3263c427e86943da127401e1004350 (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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# frozen_string_literal: true

module Gitlab
  module Utils
    module InlineHash
      extend self

      # Transforms a Hash into an inline Hash by merging its nested keys.
      #
      # Input
      #
      #  {
      #    'root_param' => 'Root',
      #    12 => 'number',
      #    symbol: 'symbol',
      #    nested_param: {
      #      key: 'Value'
      #    },
      #    'very' => {
      #      'deep' => {
      #        'nested' => {
      #          12 => 'Deep nested value'
      #        }
      #      }
      #    }
      #  }
      #
      #
      # Result
      #
      #  {
      #    'root_param' => 'Root',
      #     12 => 'number',
      #     symbol: symbol,
      #    'nested_param.key' => 'Value',
      #    'very.deep.nested.12' => 'Deep nested value'
      #  }
      #
      def merge_keys(hash, prefix: nil, connector: '.')
        result = {}
        pairs =
          if prefix
            base_prefix = "#{prefix}#{connector}"
            hash.map { |key, value| ["#{base_prefix}#{key}", value] }
          else
            hash.to_a
          end

        until pairs.empty?
          key, value = pairs.shift

          if value.is_a?(Hash)
            value.each { |k, v| pairs.unshift ["#{key}#{connector}#{k}", v] }
          else
            result[key] = value
          end
        end

        result
      end
    end
  end
end