]> git.donarmstrong.com Git - dsa-puppet.git/blob - 3rdparty/modules/stdlib/lib/puppet/parser/functions/validate_integer.rb
upgrade to stdlib 4.6.1
[dsa-puppet.git] / 3rdparty / modules / stdlib / lib / puppet / parser / functions / validate_integer.rb
1 module Puppet::Parser::Functions
2
3   newfunction(:validate_integer, :doc => <<-'ENDHEREDOC') do |args|
4     Validate that the first argument is an integer (or an array of integers). Abort catalog compilation if any of the checks fail.
5     
6     The second argument is optional and passes a maximum. (All elements of) the first argument has to be less or equal to this max.
7
8     The third argument is optional and passes a minimum.  (All elements of) the first argument has to be greater or equal to this min.
9     If, and only if, a minimum is given, the second argument may be an empty string or undef, which will be handled to just check
10     if (all elements of) the first argument are greater or equal to the given minimum.
11
12     It will fail if the first argument is not an integer or array of integers, and if arg 2 and arg 3 are not convertable to an integer.
13
14     The following values will pass:
15
16       validate_integer(1)
17       validate_integer(1, 2)
18       validate_integer(1, 1)
19       validate_integer(1, 2, 0)
20       validate_integer(2, 2, 2)
21       validate_integer(2, '', 0)
22       validate_integer(2, undef, 0)
23       $foo = undef
24       validate_integer(2, $foo, 0)
25       validate_integer([1,2,3,4,5], 6)
26       validate_integer([1,2,3,4,5], 6, 0)
27
28     Plus all of the above, but any combination of values passed as strings ('1' or "1").
29     Plus all of the above, but with (correct) combinations of negative integer values.
30
31     The following values will not:
32
33       validate_integer(true)
34       validate_integer(false)
35       validate_integer(7.0)
36       validate_integer({ 1 => 2 })
37       $foo = undef
38       validate_integer($foo)
39       validate_integer($foobaridontexist)
40
41       validate_integer(1, 0)
42       validate_integer(1, true)
43       validate_integer(1, '')
44       validate_integer(1, undef)
45       validate_integer(1, , 0)
46       validate_integer(1, 2, 3)
47       validate_integer(1, 3, 2)
48       validate_integer(1, 3, true)
49
50     Plus all of the above, but any combination of values passed as strings ('false' or "false").
51     Plus all of the above, but with incorrect combinations of negative integer values.
52     Plus all of the above, but with non-integer crap in arrays or maximum / minimum argument.
53
54     ENDHEREDOC
55
56     # tell the user we need at least one, and optionally up to two other parameters
57     raise Puppet::ParseError, "validate_integer(): Wrong number of arguments; must be 1, 2 or 3, got #{args.length}" unless args.length > 0 and args.length < 4
58
59     input, max, min = *args
60
61     # check maximum parameter
62     if args.length > 1
63       max = max.to_s
64       # allow max to be empty (or undefined) if we have a minimum set
65       if args.length > 2 and max == ''
66         max = nil
67       else
68         begin
69           max = Integer(max)
70         rescue TypeError, ArgumentError
71           raise Puppet::ParseError, "validate_integer(): Expected second argument to be unset or an Integer, got #{max}:#{max.class}"
72         end
73       end
74     else
75       max = nil
76     end
77
78     # check minimum parameter
79     if args.length > 2
80       begin
81         min = Integer(min.to_s)
82       rescue TypeError, ArgumentError
83         raise Puppet::ParseError, "validate_integer(): Expected third argument to be unset or an Integer, got #{min}:#{min.class}"
84       end
85     else
86       min = nil
87     end
88
89     # ensure that min < max
90     if min and max and min > max
91       raise Puppet::ParseError, "validate_integer(): Expected second argument to be larger than third argument, got #{max} < #{min}"
92     end
93
94     # create lamba validator function
95     validator = lambda do |num|
96       # check input < max
97       if max and num > max
98         raise Puppet::ParseError, "validate_integer(): Expected #{input.inspect} to be smaller or equal to #{max}, got #{input.inspect}."
99       end
100       # check input > min (this will only be checked if no exception has been raised before)
101       if min and num < min
102         raise Puppet::ParseError, "validate_integer(): Expected #{input.inspect} to be greater or equal to #{min}, got #{input.inspect}."
103       end
104     end
105
106     # if this is an array, handle it.
107     case input
108     when Array
109       # check every element of the array
110       input.each_with_index do |arg, pos|
111         begin
112           arg = Integer(arg.to_s)
113           validator.call(arg)
114         rescue TypeError, ArgumentError
115           raise Puppet::ParseError, "validate_integer(): Expected element at array position #{pos} to be an Integer, got #{arg.class}"
116         end
117       end
118     # for the sake of compatibility with ruby 1.8, we need extra handling of hashes
119     when Hash
120       raise Puppet::ParseError, "validate_integer(): Expected first argument to be an Integer or Array, got #{input.class}"
121     # check the input. this will also fail any stuff other than pure, shiny integers
122     else
123       begin
124         input = Integer(input.to_s)
125         validator.call(input)
126       rescue TypeError, ArgumentError
127         raise Puppet::ParseError, "validate_integer(): Expected first argument to be an Integer or Array, got #{input.class}"
128       end
129     end
130   end
131 end