summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorHelen Campbell <helen@puppetlabs.com>2016-08-10 14:17:16 +0100
committerHelen Campbell <helen@puppetlabs.com>2016-08-11 18:59:15 +0100
commitadf922c28441bc95f5cbac1f0951256c080b3298 (patch)
tree709bcf434658a291ce9a87e3bc4639992141725b /lib
parent999c267a3871c7d59513869c94c43c3477f1c6f1 (diff)
(WIP) Addition of validate legacy function
Diffstat (limited to 'lib')
-rw-r--r--lib/puppet/functions/validate_legacy.rb54
1 files changed, 54 insertions, 0 deletions
diff --git a/lib/puppet/functions/validate_legacy.rb b/lib/puppet/functions/validate_legacy.rb
new file mode 100644
index 0000000..9d7d012
--- /dev/null
+++ b/lib/puppet/functions/validate_legacy.rb
@@ -0,0 +1,54 @@
+Puppet::Functions.create_function(:validate_legacy, Puppet::Functions::InternalFunction) do
+ # The function checks a value against both the target_type (new) and the previous_validation function (old).
+
+ dispatch :validate_legacy do
+ param 'Type', :target_type
+ param 'String', :previous_validation
+ param 'NotUndef', :value
+ optional_param 'Any', :args
+ end
+ dispatch :validate_legacy_s do
+ scope_param
+ param 'String', :type_string
+ param 'String', :previous_validation
+ param 'NotUndef', :value
+ optional_repeated_param 'Any', :args
+ end
+
+ def validate_legacy_s(scope, type_string, *args)
+ t = Puppet::Pops::Types::TypeParser.new.parse(type_string, scope)
+ validate_legacy(t, *args)
+ end
+
+ def validate_legacy(target_type, previous_validation, value, *prev_args)
+ if assert_type(target_type, value)
+ if previous_validation(previous_validation, value, *prev_args)
+ # Silently passes
+ else
+ Puppet.warn("Accepting previously invalid value for target_type '#{target_type}'")
+ end
+ else
+ inferred_type = Puppet::Pops::Types::TypeCalculator.infer_set(value)
+ error_msg = Puppet::Pops::Types::TypeMismatchDescriber.new.describe_mismatch(previous_validation, target_type, inferred_type)
+ if previous_validation(previous_validation, value, *prev_args)
+ Puppet.warn(error_msg)
+ else
+ call_function('fail', error_msg)
+ end
+ end
+ end
+
+ def previous_validation(previous_validation, value, *prev_args)
+ # Call the previous validation function and catch any errors. Return true if no errors are thrown.
+ begin
+ call_function(previous_validation, value, *prev_args)
+ true
+ rescue Puppet::ParseError
+ false
+ end
+ end
+
+ def assert_type(type, value)
+ Puppet::Pops::Types::TypeCalculator.instance?(type, value)
+ end
+end