summaryrefslogtreecommitdiffstats
path: root/lib/puppet/parser/ast
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
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')
-rw-r--r--lib/puppet/parser/ast/leaf.rb27
-rw-r--r--lib/puppet/parser/ast/vardef.rb12
2 files changed, 31 insertions, 8 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
diff --git a/lib/puppet/parser/ast/vardef.rb b/lib/puppet/parser/ast/vardef.rb
index ae24b3233..f103d49c3 100644
--- a/lib/puppet/parser/ast/vardef.rb
+++ b/lib/puppet/parser/ast/vardef.rb
@@ -13,11 +13,15 @@ class Puppet::Parser::AST
# Look up our name and value, and store them appropriately. The
# lexer strips off the syntax stuff like '$'.
def evaluate(scope)
- name = @name.safeevaluate(scope)
value = @value.safeevaluate(scope)
-
- parsewrap do
- scope.setvar(name,value, :file => @file, :line => @line, :append => @append)
+ if name.is_a?(HashOrArrayAccess)
+ name.assign(scope, value)
+ else
+ name = @name.safeevaluate(scope)
+
+ parsewrap do
+ scope.setvar(name,value, :file => @file, :line => @line, :append => @append)
+ end
end
end