Completed
Push — master ( 308a2c...1aebdd )
by Fike
01:00
created

Path.push()   A

Complexity

Conditions 1

Size

Total Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 7
rs 9.4285
cc 1
1
# frozen_string_literal: true
2
3
require_relative 'path/segment'
4
5
module AMA
6
  module Entity
7
    class Mapper
8
      # Wrapper for simple array. Helps to understand where exactly processing
9
      # is taking place.
10
      class Path
11
        attr_reader :segments
12
13
        def initialize(stack = [])
14
          @segments = stack
15
        end
16
17
        def empty?
18
          @segments.empty?
19
        end
20
21
        # @param [String, Symbol, Integer] name
22
        # @return [AMA::Entity::Mapper::Path]
23
        def index(name)
24
          push(Segment.index(name))
25
        end
26
27
        # @param [String, Symbol] name
28
        # @return [AMA::Entity::Mapper::Path]
29
        def attribute(name)
30
          push(Segment.attribute(name))
31
        end
32
33
        # @param [Array<AMA::Entity::Mapper::Path::Segment>] segments
34
        # @return [AMA::Entity::Mapper::Path]
35
        def push(*segments)
36
          segments = segments.map do |segment|
37
            next segment if segment.is_a?(Segment)
38
            Segment.attribute(segment)
39
          end
40
          self.class.new(@segments + segments)
41
        end
42
43
        # @return [AMA::Entity::Mapper::Path]
44
        def pop
45
          self.class.new(@segments[0..-2])
46
        end
47
48
        # @return [AMA::Entity::Mapper::Path::Segment]
49
        def current
50
          @segments.last
51
        end
52
53
        def each
54
          @segments.each do |item|
55
            yield(item)
56
          end
57
        end
58
59
        def reduce(carrier)
60
          @segments.reduce(carrier) do |inner_carrier, item|
61
            yield(inner_carrier, item)
62
          end
63
        end
64
65
        # @param [AMA::Entity::Mapper::Path] path
66
        # @return [AMA::Entity::Mapper::Path]
67
        def merge(path)
68
          push(*path.segments)
69
        end
70
71
        def size
72
          @segments.size
73
        end
74
75
        def segments
76
          @segments.clone
77
        end
78
79
        # @return [Array<AMA::Entity::Mapper::Path::Segment>]
80
        def to_a
81
          @segments.clone
82
        end
83
84
        # @return [String]
85
        def to_s
86
          "$#{@segments.join}"
87
        end
88
      end
89
    end
90
  end
91
end
92