def initialize(markup)
markup += "\n" unless markup.end_with?("\n") || markup.length == 0
begin
tree = Parslet.new.parse(markup)
rescue Parslet::ParseFailed => failure
puts failure.cause.ascii_tree
end
parts = Transformer.new.apply(tree) || []
@parsed = {}
@current = @parsed
@current_path = ''
parts.each do |part|
if part.is_a? Key
if @current.is_a? Array
@current << {} if @current.last.nil?
@current.last[part.key] = part.value
next
end
if !@current.is_a?(Hash) || @current.has_key?(part.key)
err = "Cannot override key '#{part.key}'"
unless @current_path.empty?
err += " at path '#{@current_path}'"
end
raise err
end
@current[part.key] = part.value
elsif part.is_a?(TableArray)
resolve_table_array(part)
elsif part.is_a?(Table)
resolve_table(part)
else
raise "Unrecognized part: #{part.inspect}"
end
end
end