Class: OpenStruct

Inherits:
Object
  • Object
show all
Defined in:
lib/extensions/openstruct_merge.rb

Class Method Summary collapse

Class Method Details

.merge(*args) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/extensions/openstruct_merge.rb', line 7

def self.merge(*args)
  result = OpenStruct.new

  args.each do |arg|
    unless [Hash, OpenStruct].include?(arg.class)
      raise ArgumentError, "Only OpenStruct or Hash objects are allowed. bad: #{arg.class}"
    end

    arg.each_pair do |key, value|
      set_value(result, key, value)
    end
  end

  result
end

.set_value(result, key, value) ⇒ Object

Sets value in result OpenStruct, handling nested OpenStruct and Hash objects Skip nil values to avoid overwriting existing values with nil



25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/extensions/openstruct_merge.rb', line 25

def self.set_value(result, key, value)
  # Skip nil values - don't overwrite existing values with nil
  return if value.nil?

  if value.is_a?(OpenStruct) || value.is_a?(Hash)
    current_value = result[key]
    current_value = {} if current_value.nil?
    merged_value  = merge(current_value, value.to_h)
    result[key]   = merged_value
  else
    result[key] = value
  end
end