diff options
| author | Brice Figureau <brice-puppet@daysofwonder.com> | 2009-11-14 19:51:15 +0100 |
|---|---|---|
| committer | test branch <puppet-dev@googlegroups.com> | 2010-02-17 06:50:53 -0800 |
| commit | 164f1ce85bad49c7e197deeb452828c94539e06e (patch) | |
| tree | 6978a10e67447e0a28ed73dd2a0f352c4d6470df /lib/puppet/parser/ast | |
| parent | fd427a51bc2bd97656767acc7f6b48160f8e60c4 (diff) | |
| download | puppet-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.rb | 27 | ||||
| -rw-r--r-- | lib/puppet/parser/ast/vardef.rb | 12 |
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 |
