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
|
module TomlRB
class TableArray
def initialize(dotted_keys)
@dotted_keys = dotted_keys
end
def navigate_keys(hash, symbolize_keys = false)
current = hash
keys = symbolize_keys ? @dotted_keys.map(&:to_sym) : @dotted_keys
last_key = keys.pop
# Go over the parent keys
keys.each do |key|
current[key] = {} unless current[key]
if current[key].is_a? Array
current[key] << {} if current[key].empty?
current = current[key].last
else
current = current[key]
end
end
# Define Table Array
if current[last_key].is_a? Hash
fail TomlRB::ParseError,
"#{last_key} was defined as hash but is now redefined as a table!"
end
current[last_key] = [] unless current[last_key]
current[last_key] << {}
current[last_key].last
end
def accept_visitor(parser)
parser.visit_table_array self
end
def full_key
@dotted_keys.join(".")
end
end
# Used in document.citrus
module TableArrayParser
def value
TomlRB::TableArray.new(captures[:stripped_key].map(&:value).first)
end
end
end
|