// Symbols
dot = _{"."}
underscore = _{"_"}
colon = _{":"}
comma = _{","}
start_param_list = _{"("}
end_param_list = _{")"}
start_ret_struct = _{"{"}
end_ret_struct = _{"}"}
// Postgres identifiers
lowercase_letter = _{'a'..'z'}
uppercase_letter = _{'A'..'Z'}
letter = _{ lowercase_letter | uppercase_letter }
digit = _{'0'..'9'}
postgres_alpha = _{ letter | digit | underscore }
ident = { (underscore | letter) ~ postgres_alpha* }
// Query parameters
parameter_list = {
start_param_list
~ (ident ~ (comma ~ ident)*)?
~ (comma)?
~ end_param_list
}
// Query return
nullable_return_param = {ident ~ nullable_marker}
non_nullable_return_param = {ident}
return_param = _{nullable_return_param | non_nullable_return_param }
nullable_marker = _{"?"}
inferred_params = { return_param ~ (comma ~ return_param)* }
implicit_return = { "" }
struct_return = {
start_ret_struct
~ inferred_params?
~ comma?
~ end_ret_struct
}
return_type = _{(struct_return) | (implicit_return)}
// Query quantifier
zero_or_more = {"*"}
zero_or_one = {"?"}
one = {""}
quantifier = {zero_or_more | zero_or_one | one}
// Parser
parser = {
SOI
~ ident
~ parameter_list
~ return_type
~ quantifier
~ EOI
}