class TOML::Parser
Attributes
parsed[R]
Public Class Methods
new(markup)
click to toggle source
# File lib/toml/parser.rb, line 5 def initialize(markup) # Make sure we have a newline on the end markup += "\n" unless markup.end_with?("\n") || markup.length == 0 tree = Parslet.new.parse(markup) parts = Transformer.new.apply(tree) || [] @parsed = {} @current = @parsed @current_path = '' parts.each do |part| if part.is_a? Key # If @current is an array then we're in a key-group if @current.is_a? Array # Make sure there's a table to work with. @current << {} if @current.last.nil? # Set the key on the table. @current.last[part.key] = part.value next end # Make sure the key isn't already set 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 # Set the key-value into the current hash @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
Public Instance Methods
resolve_table(t)
click to toggle source
# File lib/toml/parser.rb, line 78 def resolve_table(t) @current = @parsed path = t.name.dup @current_path = path.join('.') while k = path.shift # If it's a table-array then get the last item. @current = @current.last if @current.is_a? Array # Create a new table if one doesn't exist. @current[k] = {} if !@current.has_key? k # Move into the table. @current = @current[k] end end
resolve_table_array(t)
click to toggle source
# File lib/toml/parser.rb, line 46 def resolve_table_array(t) @current = @parsed path = t.name.dup @current_path = path.join('.') while n = path.shift # If it's a table-array then get the last item. @current = @current.last if @current.is_a? Array # If it's the last item: if path.length == 0 # If the current table has an item: if @current.has_key?(n) # And that item is already a table-array: if @current[n].is_a? Array # Then add an item to that table-array. @current[n] << {} else raise "Cannot override table array '#{t.name.join '.'}'" end else # Create a new table array if nothing exists here. @current[n] = [] end elsif @current.has_key? n # Don't do anything if we're just moving into tables. else @current[n] = {} end @current = @current[n] end end