summaryrefslogtreecommitdiffstats
path: root/lib/puppet/parser/ast/caseopt.rb
blob: 47f32e2eeeaf534bbce68aabe937b9a161207c31 (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
59
60
61
62
63
64
65
66
67
68
69
70
require 'puppet/parser/ast/branch'

class Puppet::Parser::AST
    # Each individual option in a case statement.
    class CaseOpt < AST::Branch
        attr_accessor :value, :statements

        # CaseOpt is a bit special -- we just want the value first,
        # so that CaseStatement can compare, and then it will selectively
        # decide whether to fully evaluate this option

        def each
            [@value,@statements].each { |child| yield child }
        end

        # Are we the default option?
        def default?
            # Cache the @default value.
            if defined? @default
                return @default
            end

            if @value.is_a?(AST::ASTArray)
                @value.each { |subval|
                    if subval.is_a?(AST::Default)
                        @default = true
                        break
                    end
                }
            else
                if @value.is_a?(AST::Default)
                    @default = true
                end
            end

            unless defined? @default
                @default = false
            end

            return @default
        end

        # You can specify a list of values; return each in turn.
        def eachvalue(scope)
            if @value.is_a?(AST::ASTArray)
                @value.each { |subval|
                    yield subval.safeevaluate(scope)
                }
            else
                yield @value.safeevaluate(scope)
            end
        end

        def eachopt
            if @value.is_a?(AST::ASTArray)
                @value.each { |subval|
                    yield subval
                }
            else
                yield @value
            end
        end

        # Evaluate the actual statements; this only gets called if
        # our option matched.
        def evaluate(scope)
            return @statements.safeevaluate(scope)
        end
    end
end