Class: Macros4Cuke::CollWalkerFactory

Inherits:
Object
  • Object
show all
Defined in:
lib/macros4cuke/coll-walker-factory.rb

Overview

A Coll(ection)WalkerFactory object is a factory that creates an enumerator that itself walks in the passed macro collection object. The walker performs a depth-first visit and yields visit events.

Defined Under Namespace

Classes: StringNode

Instance Method Summary collapse

Instance Method Details

#build_walker(aMacroCollection) ⇒ Enumerator

Factory method.

Parameters:

  • aMacroCollection (MacroCollection)

    The collection of macros encountered so far

Returns:

  • (Enumerator)


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
71
72
73
74
75
76
77
# File 'lib/macros4cuke/coll-walker-factory.rb', line 21

def build_walker(aMacroCollection)
  level = 0
  collection = aMacroCollection
  current_node = collection
  backlog = collection.macro_steps.values

  visitor = Enumerator.new do |result_receiver| # argument is a Yielder
    loop do
      case current_node
        when MacroCollection
          result_receiver << [:on_collection, level, current_node]
          level += 1
          backlog << StringNode.new(:on_collection_end, nil)

        when MacroStep
          result_receiver << emit_on_step(current_node, level, backlog)
          level += 1

        when StringNode
          level -= 1 if current_node.event.to_s =~ /_end$/
          event = [current_node.event, level, current_node.text]
          event << current_node.extra unless current_node.extra.nil?
          result_receiver << event

        when Templating::Engine
          result_receiver << emit_on_renderer(current_node, level, backlog)
          level += 1

        when Templating::StaticText
          result_receiver << [:on_static_text, level, current_node.source]

        when Templating::Comment
          result_receiver << [:on_comment, level, current_node.source]

        when Templating::EOLine
          result_receiver << [:on_eol, level, nil]

        when Templating::Placeholder
          result_receiver << [:on_placeholder, level, current_node.name]

        when Templating::Section
          result_receiver << emit_on_section(current_node, level, backlog)
          level += 1

        else
          err_msg = "Don't know how to format a #{current_node.class}."
          raise(InternalError, err_msg)
      end

      current_node = backlog.shift
      break if current_node.nil?
    end
  end


  return visitor
end