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
|
require 'puppet/parser/ast'
require 'puppet/parser/ast/branch'
require 'puppet/parser/relationship'
class Puppet::Parser::AST::Relationship < Puppet::Parser::AST::Branch
RELATIONSHIP_TYPES = %w{-> <- ~> <~}
attr_accessor :left, :right, :arrow, :type
def actual_left
chained? ? left.right : left
end
# Evaluate our object, but just return a simple array of the type
# and name.
def evaluate(scope)
if chained?
real_left = left.safeevaluate(scope)
left_dep = left_dep.shift if left_dep.is_a?(Array)
else
real_left = left.safeevaluate(scope)
end
real_right = right.safeevaluate(scope)
source, target = sides2edge(real_left, real_right)
result = Puppet::Parser::Relationship.new(source, target, type)
scope.compiler.add_relationship(result)
real_right
end
def initialize(left, right, arrow, args = {})
super(args)
unless RELATIONSHIP_TYPES.include?(arrow)
raise ArgumentError, "Invalid relationship type #{arrow.inspect}; valid types are #{RELATIONSHIP_TYPES.collect { |r| r.to_s }.join(", ")}"
end
@left, @right, @arrow = left, right, arrow
end
def type
subscription? ? :subscription : :relationship
end
def sides2edge(left, right)
out_edge? ? [left, right] : [right, left]
end
private
def chained?
left.is_a?(self.class)
end
def out_edge?
["->", "~>"].include?(arrow)
end
def subscription?
["~>", "<~"].include?(arrow)
end
end
|