summaryrefslogtreecommitdiffstats
path: root/lib/puppet/parser/ast/casestatement.rb
blob: 3c6f9c7e2e622bf99d5c5787cc73e690f75d2497 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
require 'puppet/parser/ast/branch'

class Puppet::Parser::AST
    # The basic logical structure in Puppet.  Supports a list of
    # tests and statement arrays.
    class CaseStatement < AST::Branch
        attr_accessor :test, :options, :default

        # Short-curcuit evaluation.  Return the value of the statements for
        # the first option that matches.
        def evaluate(hash)
            scope = hash[:scope]
            value = @test.safeevaluate(:scope => scope)
            sensitive = Puppet[:casesensitive]
            value = value.downcase if ! sensitive and value.respond_to?(:downcase)

            retvalue = nil
            found = false
            
            # Iterate across the options looking for a match.
            default = nil
            @options.each { |option|
                option.eachvalue(scope) { |opval|
                    opval = opval.downcase if ! sensitive and opval.respond_to?(:downcase)
                    if opval == value
                        found = true
                        break
                    end
                }

                if found
                    # we found a matching option
                    retvalue = option.safeevaluate(:scope => scope)
                    break
                end

                if option.default?
                    default = option
                end
            }

            # Unless we found something, look for the default.
            unless found
                if default
                    retvalue = default.safeevaluate(:scope => scope)
                else
                    Puppet.debug "No true answers and no default"
                    retvalue = nil
                end
            end
            return retvalue
        end

        def each
            [@test,@options].each { |child| yield child }
        end
    end
end