# 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