summaryrefslogtreecommitdiffstats
path: root/lib/puppet/parser/ast/leaf.rb
diff options
context:
space:
mode:
authorBrice Figureau <brice-puppet@daysofwonder.com>2009-11-14 19:51:15 +0100
committertest branch <puppet-dev@googlegroups.com>2010-02-17 06:50:53 -0800
commit164f1ce85bad49c7e197deeb452828c94539e06e (patch)
tree6978a10e67447e0a28ed73dd2a0f352c4d6470df /lib/puppet/parser/ast/leaf.rb
parentfd427a51bc2bd97656767acc7f6b48160f8e60c4 (diff)
downloadpuppet-164f1ce85bad49c7e197deeb452828c94539e06e.tar.gz
puppet-164f1ce85bad49c7e197deeb452828c94539e06e.tar.xz
puppet-164f1ce85bad49c7e197deeb452828c94539e06e.zip
Allow adding single key to hashes
This patch allow this syntax: $hash[mykey] = 12 If the key already exist an error is raised. Hashes are essentially write only, like puppet variables. Signed-off-by: Brice Figureau <brice-puppet@daysofwonder.com>
Diffstat (limited to 'lib/puppet/parser/ast/leaf.rb')
-rw-r--r--lib/puppet/parser/ast/leaf.rb27
1 files changed, 23 insertions, 4 deletions
diff --git a/lib/puppet/parser/ast/leaf.rb b/lib/puppet/parser/ast/leaf.rb
index 206ea5cbe..0f427ef37 100644
--- a/lib/puppet/parser/ast/leaf.rb
+++ b/lib/puppet/parser/ast/leaf.rb
@@ -142,17 +142,36 @@ class Puppet::Parser::AST
class HashOrArrayAccess < AST::Leaf
attr_accessor :variable, :key
- def evaluate(scope)
+ def evaluate_container(scope)
container = variable.respond_to?(:evaluate) ? variable.safeevaluate(scope) : variable
- object = (container.is_a?(Hash) or container.is_a?(Array)) ? container : scope.lookupvar(container)
+ (container.is_a?(Hash) or container.is_a?(Array)) ? container : scope.lookupvar(container)
+ end
- accesskey = key.respond_to?(:evaluate) ? key.safeevaluate(scope) : key
+ def evaluate_key(scope)
+ key.respond_to?(:evaluate) ? key.safeevaluate(scope) : key
+ end
+
+ def evaluate(scope)
+ object = evaluate_container(scope)
unless object.is_a?(Hash) or object.is_a?(Array)
raise Puppet::ParseError, "#{variable} is not an hash or array when accessing it with #{accesskey}"
end
- return object[accesskey]
+ return object[evaluate_key(scope)]
+ end
+
+ # Assign value to this hashkey or array index
+ def assign(scope, value)
+ object = evaluate_container(scope)
+ accesskey = evaluate_key(scope)
+
+ if object.is_a?(Hash) and object.include?(accesskey)
+ raise Puppet::ParseError, "Assigning to the hash '#{variable}' with an existing key '#{accesskey}' is forbidden"
+ end
+
+ # assign to hash or array
+ object[accesskey] = value
end
def to_s