unstructured 0.5.1

Generic types for unstructured data
Documentation
WHITESPACE = _{ " " }

selector = _{ SOI ~ (target | pointer) ~ EOI }

pointer_sep = _{ "/" }
pointer = _{ pointer_sep ~ (ident | index)* ~ pointer* }

target = _{ (array_index | hash | identity)+ }
identity = _{ "." }
hash = _{ identity ~ (ident | ( "[" ~ text ~ "]")) }
array_index = _{ identity ~ "[" ~ (index) ~ "]" }

selector_filter = _{ SOI ~ doc_wildcard | (doc_index_target ~ (filter_target | pointer)? ~ pipe?)* ~ EOI }
doc_index_target = _{ "[" ~ doc_index ~ "]" }
doc_index = { ASCII_DIGIT+ }
doc_wildcard = { "*" }
filter_target = _{ (array_range | array_index | hash | identity)+ }
array_range = _{ identity ~ "[" ~ range ~ "]" }

text = _{ "\"" ~ chars ~ "\"" }
pipe = { "<" | "|" }
chars = { char* }
index = { ASCII_DIGIT+ }
range = @{ (ASCII_DIGIT+)? ~ ":" ~ (ASCII_DIGIT+)? }
char = _{
    !("\"" | "\\") ~ ANY
    | "\\" ~ ("\"" | "\\" | "/" | "b" | "f" | "n" | "r" | "t")
    | "\\" ~ ("u" ~ ASCII_HEX_DIGIT{4})
}
ident = @{ ASCII_ALPHA ~ ASCII_ALPHANUMERIC+? }