5 # TODO(Krzysztof Wilczynski): We probably need to approach numeric values differently ...
7 module Puppet::Parser::Functions
8 newfunction(:range, :type => :rvalue, :doc => <<-EOS
9 When given range in the form of (start, stop) it will extrapolate a range as
16 Will return: [0,1,2,3,4,5,6,7,8,9]
20 Will return: [0,1,2,3,4,5,6,7,8,9] (Zero padded strings are converted to
21 integers automatically)
25 Will return: ["a","b","c"]
27 range("host01", "host10")
28 Will return: ["host01", "host02", ..., "host09", "host10"]
29 NB Be explicit in including trailing zeros. Otherwise the underlying ruby function will fail.
31 Passing a third argument will cause the generated range to step by that
36 Will return: [0,2,4,6,8]
40 raise(Puppet::ParseError, 'range(): Wrong number of arguments given (0 for 1)') if arguments.size == 0
45 step = arguments[2].nil? ? 1 : arguments[2].to_i.abs
47 type = '..' # Use the simplest type of Range available in Ruby
49 else # arguments.size == 1
52 if m = value.match(/^(\w+)(\.\.\.?|\-)(\w+)$/)
58 elsif value.match(/^.+$/)
59 raise(Puppet::ParseError, "range(): Unable to compute range from the value: #{value}")
61 raise(Puppet::ParseError, "range(): Unknown range format: #{value}")
65 # If we were given an integer, ensure we work with one
66 if start.to_s.match(/^\d+$/)
75 when /^(\.\.|\-)$/ then (start .. stop)
76 when '...' then (start ... stop) # Exclusive of last element
79 result = range.step(step).to_a
85 # vim: set ts=2 sw=2 et :