keyvalues3 1.1.0

A Rust library and CLI tool for parsing, formatting, and converting Valve's KeyValues3 (KV3) text format.
Documentation
WHITESPACE = _{ " " | "\t" | NEWLINE }

file = { SOI ~ root ~ EOI }

root = _{ header? ~ (object | array) }

header           =  { "<!--" ~ "kv3" ~ metadata+ ~ "-->" }
metadata         = ${ metadata_key ~ ":" ~ metadata_value ~ ":" ~ "version" ~ "{" ~ metadata_version ~ "}" }
metadata_key     = @{ (ASCII_ALPHANUMERIC | "_")+ }
metadata_value   = @{ (ASCII_ALPHANUMERIC | "_")+ }
metadata_version = @{ guid }
guid             = @{ hex{8} ~ "-" ~ hex{4} ~ "-" ~ hex{4} ~ "-" ~ hex{4} ~ "-" ~ hex{12} }
hex              = @{ ASCII_HEX_DIGIT }

object      =  { "{" ~ object_pair* ~ "}" }
object_pair =  { object_key ~ "=" ~ value }
object_key  = _{ identifier | string }

array = { "[" ~ (value ~ ","?)* ~ "]" }

value = _{ object | array | flag | multiline_string | string | number | boolean | null }

flag = { identifier ~ ":" ~ value }

boolean = { "true" | "false" }

null = { "null" }

identifier = ${ (ASCII_ALPHANUMERIC | "_")+ }

string           = ${ "\"" ~ string_value ~ "\"" }
string_value     = @{ string_character* }
string_character =  {
    !("\"" | "\\") ~ ANY
  | "\\" ~ ("\"" | "\\" | "/" | "b" | "f" | "n" | "r" | "t")
}

multiline_string           = ${ "\"\"\"" ~ NEWLINE ~ multiline_string_value ~ NEWLINE ~ "\"\"\"" }
multiline_string_value     = @{ multiline_string_character* }
multiline_string_character =  {
    !(NEWLINE ~ "\"\"\"") ~ ANY
}

number = @{
    "-"? ~ ("0" | ASCII_NONZERO_DIGIT ~ ASCII_DIGIT*) ~ ("." ~ ASCII_DIGIT*)? ~ (^"e" ~ ("+" | "-")? ~ ASCII_DIGIT+)?
}