Class: StructureWalker::Builder

Inherits:
Object
  • Object
show all
Defined in:
lib/structure_walker.rb

Class Method Summary collapse

Class Method Details

.invoke(proc) ⇒ Object



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
# File 'lib/structure_walker.rb', line 6

def invoke(proc)
  walker = -> (steps, data) do
    return if data.nil?
    if steps.empty?
      result = proc.call(data)
    else
      steps = steps.clone
      step = steps.shift
      key = step.first
      data_type = step.last
      result = case key
               when :enum
                 if data_type == :hash
                   data.each { |_k,v| walker.call(steps, v) }
                 elsif data_type == :array
                   data.each { |v| walker.call(steps, v) }
                 end
               when :key
                 walker.call(steps, data[data_type])
               when :method
                 record = data.send(data_type)
                 walker.call(steps, record)
               end
    end
    result
  end

  walker
end