grammar TomlRB::Document

include TomlRB::Primitive
include TomlRB::Arrays

rule document
  (comment | table_array | table | keyvalue | line_break)*
end

rule table_array
  (space? '[[' stripped_key ']]' comment?) <TomlRB::TableArrayParser>
end

rule table
  (space? '[' stripped_key ']' comment?) <TomlRB::TableParser>
end

rule keyvalue
  (stripped_key '=' space? v:(toml_values) comment?) <TomlRB::KeyvalueParser>
end

rule inline_table
  (space? '{' (keyvalue? (',' keyvalue)*)? space? '}' ) <TomlRB::InlineTableParser>
end

rule inline_table_array
  (inline_table (space "," array_comments inline_table)*) {
    captures[:inline_table].map(&:value).map(&:value)
  }
end

rule array
  ("[" array_comments (array_elements)? space ","? array_comments "]" indent?) <TomlRB::ArrayParser>
end

rule array_elements
  inline_table_array | float_array | string_array | array_array | integer_array | datetime_array | bool_array
end

rule array_array
  (array (space "," array_comments array)*) {
    captures[:array].map(&:value)
  }
end

rule toml_values
  primitive | inline_table | array | inline_table_array
end

rule stripped_key
  (space? key space?) { captures[:key].first.value }
end

end