Class: Tomlrb::Handler

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(**options) ⇒ Handler

Returns a new instance of Handler.



7
8
9
10
11
12
13
14
15
# File 'lib/tomlrb/handler.rb', line 7

def initialize(**options)
  @output = {}
  @current = @output
  @stack = []
  @array_names = []
  @current_table = []
  @keys = Keys.new
  @symbolize_keys = options[:symbolize_keys]
end

Instance Attribute Details

#outputObject (readonly)

Returns the value of attribute output.



5
6
7
# File 'lib/tomlrb/handler.rb', line 5

def output
  @output
end

#symbolize_keysObject (readonly)

Returns the value of attribute symbolize_keys.



5
6
7
# File 'lib/tomlrb/handler.rb', line 5

def symbolize_keys
  @symbolize_keys
end

Instance Method Details

#assign(k) ⇒ Object



60
61
62
63
64
65
66
67
# File 'lib/tomlrb/handler.rb', line 60

def assign(k)
  @keys.add_pair_key k, @current_table
  current = @current
  while (key = k.shift)
    key = key.to_sym if @symbolize_keys
    current = assign_key_path(current, key, k.empty?)
  end
end

#deal_with_array_of_tables(identifiers, is_array_of_tables) {|identifiers| ... } ⇒ Object

Yields:

  • (identifiers)


39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/tomlrb/handler.rb', line 39

def deal_with_array_of_tables(identifiers, is_array_of_tables)
  stringified_identifier = identifiers.join('.')

  if is_array_of_tables
    @array_names << stringified_identifier
    last_identifier = identifiers.pop
  elsif @array_names.include?(stringified_identifier)
    raise ParseError, 'Cannot define a normal table with the same name as an already established array'
  end

  yield(identifiers)

  if is_array_of_tables
    last_identifier = last_identifier.to_sym if @symbolize_keys
    @current[last_identifier] ||= []
    raise ParseError, "Cannot use key #{last_identifier} for both table and array at once" unless @current[last_identifier].respond_to?(:<<)
    @current[last_identifier] << {}
    @current = @current[last_identifier].last
  end
end

#end_(type) ⇒ Object



108
109
110
111
112
113
114
115
116
# File 'lib/tomlrb/handler.rb', line 108

def end_(type)
  array = []
  while (value = @stack.pop) != [type]
    raise ParseError, 'Unclosed table' if @stack.empty?

    array.unshift(value)
  end
  array
end

#push(o) ⇒ Object



69
70
71
# File 'lib/tomlrb/handler.rb', line 69

def push(o)
  @stack << o
end

#push_inline(inline_arrays) ⇒ Object



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/tomlrb/handler.rb', line 73

def push_inline(inline_arrays)
  merged_inline = {}
  keys = Keys.new

  inline_arrays.each do |inline_array|
    current = merged_inline
    value = inline_array.pop
    keys.add_table_key inline_array, value.is_a?(Array)

    inline_array.each_with_index do |inline_key, inline_index|
      inline_key = inline_key.to_sym if @symbolize_keys
      last_key = inline_index == inline_array.size - 1

      if last_key
        if current[inline_key].nil?
          keys.add_pair_key [inline_key], []

          current[inline_key] = value
        else
          raise Key::KeyConflict, "Inline key #{inline_key} is already used"
        end
      else
        current[inline_key] ||= {}
        current = current[inline_key]
      end
    end
  end

  push(merged_inline)
end

#set_context(identifiers, is_array_of_tables: false) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/tomlrb/handler.rb', line 17

def set_context(identifiers, is_array_of_tables: false)
  if identifiers.empty?
    raise ParseError, 'Array needs a name'
  end

  @current_table = identifiers.dup
  @keys.add_table_key identifiers, is_array_of_tables
  @current = @output

  deal_with_array_of_tables(identifiers, is_array_of_tables) do |identifierz|
    identifierz.each do |k|
      k = k.to_sym if @symbolize_keys
      if @current[k].is_a?(Array)
        @current = @current[k].last
      else
        @current[k] ||= {}
        @current = @current[k]
      end
    end
  end
end

#start_(type) ⇒ Object



104
105
106
# File 'lib/tomlrb/handler.rb', line 104

def start_(type)
  push([type])
end

#validate_value(value) ⇒ Object



118
119
120
121
122
# File 'lib/tomlrb/handler.rb', line 118

def validate_value(value)
  if value.nil?
    raise ParseError, 'Value must be present'
  end
end