64 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
# 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
 |