diff options
author | Krzysztof Wilczynski <krzysztof.wilczynski@linux.com> | 2011-04-25 23:33:26 +0100 |
---|---|---|
committer | Krzysztof Wilczynski <krzysztof.wilczynski@linux.com> | 2011-04-25 23:33:26 +0100 |
commit | 28254bef6baa6ac9c1c26a2c58bdfd0548c7a553 (patch) | |
tree | 107830c6cbb09f3d96625acc220ad58d619501ca /join_with_prefix.rb | |
parent | 50cb2cd05afb44b02eda90be95139c01903f4090 (diff) |
Changing name of join.rb to join_with_prefix.rb to make room for
its simpler version.
Signed-off-by: Krzysztof Wilczynski <krzysztof.wilczynski@linux.com>
Diffstat (limited to 'join_with_prefix.rb')
-rw-r--r-- | join_with_prefix.rb | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/join_with_prefix.rb b/join_with_prefix.rb new file mode 100644 index 0000000..469763a --- /dev/null +++ b/join_with_prefix.rb @@ -0,0 +1,74 @@ +# +# join.rb +# + +module Puppet::Parser::Functions + newfunction(:join, :type => :rvalue, :doc => <<-EOS +This function will allow to concatenate elements of an array together +with a given suffix and optionally with prefix if such is given ... + +For example: + +Given the following sample manifest: + + define iterator { + notice $name + } + + $array = ['a', 'b', 'c'] + + $result = split(join($array, ',', 'letter_'), ',') + + notice $result + + iterator { $result: } + +This will produce the following: + + notice: Scope(Class[main]): letter_a letter_b letter_c + notice: Scope(Iterator[letter_a]): letter_a + notice: Scope(Iterator[letter_b]): letter_b + notice: Scope(Iterator[letter_c]): letter_c + +Which allows you to avoid resorting to the following: + + $result = split(inline_template("<%= array.collect { |i| \"letter_#{i}\" }.join(',') %>"), ',') + +Phasing out the need for use and abuse of the infamous inline_template +in the example above and which in this very case is extremely ugly as +we have to escape double-quotes to make Puppet parser not evaluate them. + EOS + ) do |arguments| + + # Technically we support three arguments but only first two are mandatory ... + raise(Puppet::ParseError, "join(): Wrong number of arguments " + + "given (#{arguments.size} for 2)") if arguments.size < 2 + + array = arguments[0] + + if not array.is_a?(Array) + raise(Puppet::ParseError, 'join(): Requires an array to work with') + end + + suffix = arguments[1] + prefix = arguments[2] if arguments[2] + + raise(Puppet::ParseError, 'join(): You must provide suffix ' + + 'to join array elements with') if suffix.empty? + + if prefix and prefix.empty? + raise(Puppet::ParseError, 'join(): You must provide prefix ' + + 'to add to join') + end + + if prefix and not prefix.empty? + result = prefix + array.join(suffix + prefix) + else + result = array.join(suffix) + end + + return result + end +end + +# vim: set ts=2 sw=2 et : |