2012-02-22 16:46:07 +01:00
module Puppet::Parser::Functions
newfunction ( :validate_slength , :doc = > <<-'ENDHEREDOC') do |args|
Validate that the first argument is a string ( or an array of strings ) , and
2013-06-28 18:03:37 +02:00
less / equal to than the length of the second argument . An optional third
parameter can be given a the minimum length . It fails if the first
argument is not a string or array of strings , and if arg 2 and arg 3 are
not convertable to a number .
2012-02-22 16:46:07 +01:00
The following values will pass :
validate_slength ( " discombobulate " , 17 )
validate_slength ( [ " discombobulate " , " moo " ] , 17 )
2013-06-28 18:03:37 +02:00
validate_slength ( [ " discombobulate " , " moo " ] , 17 , 3 )
2012-02-22 16:46:07 +01:00
The following valueis will not :
validate_slength ( " discombobulate " , 1 )
validate_slength ( [ " discombobulate " , " thermometer " ] , 5 )
2013-06-28 18:03:37 +02:00
validate_slength ( [ " discombobulate " , " moo " ] , 17 , 10 )
2012-02-22 16:46:07 +01:00
ENDHEREDOC
2013-08-12 20:00:27 +02:00
raise Puppet :: ParseError , " validate_slength(): Wrong number of arguments ( #{ args . length } ; must be 2 or 3) " unless args . length == 2 or args . length == 3
2012-02-22 16:46:07 +01:00
2013-08-12 20:08:35 +02:00
input , max_length , min_length = * args
unless ( input . is_a? ( String ) or input . is_a? ( Array ) )
raise Puppet :: ParseError , " validate_slength(): please pass a string, or an array of strings - what you passed didn't work for me at all - #{ input . class } "
2012-02-22 16:46:07 +01:00
end
begin
2013-08-12 20:08:35 +02:00
max_length = max_length . to_i
2012-02-22 16:46:07 +01:00
rescue NoMethodError = > e
2013-08-12 20:00:27 +02:00
raise Puppet :: ParseError , " validate_slength(): Couldn't convert whatever you passed as the max length parameter to an integer - sorry: " + e . message
2013-06-28 18:03:37 +02:00
end
unless args . length == 2
begin
2013-08-12 20:08:35 +02:00
min_length = Integer ( min_length )
2013-06-28 18:03:37 +02:00
rescue StandardError = > e
2013-08-12 20:00:27 +02:00
raise Puppet :: ParseError , " validate_slength(): Couldn't convert whatever you passed as the min length parameter to an integer - sorry: " + e . message
2013-06-28 18:03:37 +02:00
end
else
min_length = 0
2012-02-22 16:46:07 +01:00
end
2013-08-12 20:00:27 +02:00
raise Puppet :: ParseError , " validate_slength(): please pass a positive number as max_length " unless max_length > 0
raise Puppet :: ParseError , " validate_slength(): please pass a positive number as min_length " unless min_length > = 0
raise Puppet :: ParseError , " validate_slength(): please pass a min length that is smaller than the maximum " unless min_length < = max_length
2012-02-22 16:46:07 +01:00
2013-08-12 20:08:35 +02:00
case input
2012-02-22 16:46:07 +01:00
when String
2013-08-12 20:08:35 +02:00
raise Puppet :: ParseError , " validate_slength(): #{ input . inspect } is #{ input . length } characters. It should have been between #{ min_length } and #{ max_length } characters " unless input . length < = max_length and min_length < = input . length
2012-02-22 16:46:07 +01:00
when Array
2013-08-12 20:08:35 +02:00
input . each do | arg |
2012-02-22 16:46:07 +01:00
if arg . is_a? ( String )
2013-06-28 18:03:37 +02:00
unless ( arg . is_a? ( String ) and arg . length < = max_length and min_length < = arg . length )
2013-08-12 20:00:27 +02:00
raise Puppet :: ParseError , " validate_slength(): #{ arg . inspect } is #{ arg . length } characters. It should have been between #{ min_length } and #{ max_length } characters "
2012-02-22 16:46:07 +01:00
end
else
2013-08-12 20:00:27 +02:00
raise Puppet :: ParseError , " validate_slength(): #{ arg . inspect } is not a string, it's a #{ arg . class } "
2012-02-22 16:46:07 +01:00
end
end
else
2013-08-12 20:08:35 +02:00
raise Puppet :: ParseError , " validate_slength(): please pass a string, or an array of strings - what you passed didn't work for me at all - #{ input . class } "
2012-02-22 16:46:07 +01:00
end
end
end