File: concat_merge.rb

package info (click to toggle)
puppet-module-voxpupuli-elasticsearch 9.0.0-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,496 kB
  • sloc: ruby: 9,906; sh: 392; makefile: 4
file content (48 lines) | stat: -rw-r--r-- 1,411 bytes parent folder | download
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
# frozen_string_literal: true

# Top-level Puppet functions
module Puppet::Parser::Functions
  newfunction(
    :concat_merge,
    type: :rvalue,
    doc: <<-ENDHEREDOC) do |args|
    Merges two or more hashes together concatenating duplicate keys
    with array values and returns the resulting hash.

    For example:

        $hash1 = {'a' => [1]}
        $hash2 = {'a' => [2]}
        concat_merge($hash1, $hash2)
        # The resulting hash is equivalent to:
        # { 'a' => [1, 2] }

    When there is a duplicate key that is not an array, the key in
    the rightmost hash will "win."

    @return String
    ENDHEREDOC

    raise Puppet::ParseError, "concat_merge(): wrong number of arguments (#{args.length}; must be at least 2)" if args.length < 2

    concat_merge = proc do |hash1, hash2|
      hash1.merge(hash2) do |_key, old_value, new_value|
        if old_value.is_a?(Array) && new_value.is_a?(Array)
          old_value + new_value
        else
          new_value
        end
      end
    end

    result = {}
    args.each do |arg|
      next if arg.is_a?(String) && arg.empty? # empty string is synonym for puppet's undef
      # If the argument was not a hash, skip it.
      raise Puppet::ParseError, "concat_merge: unexpected argument type #{arg.class}, only expects hash arguments" unless arg.is_a?(Hash)

      result = concat_merge.call(result, arg)
    end
    result
  end
end