rohas-parser 0.1.0

Parser for Rohas schema files (.ro) defining APIs, events, models, and cron jobs
Documentation
// Rohas Schema Grammar

WHITESPACE = _{ " " | "\t" | "\r" | "\n" }
COMMENT    = _{ "//" ~ (!"\n" ~ ANY)* ~ "\n" | "/*" ~ (!"*/" ~ ANY)* ~ "*/" }

// Top-level schema
schema = { SOI ~ (model | api | event | cron | input | ws)* ~ EOI }

// Identifiers and literals
ident   = @{ ASCII_ALPHA ~ (ASCII_ALPHANUMERIC | "_")* }
string  = @{ "\"" ~ (!"\"" ~ ANY)* ~ "\"" }
number  = @{ "-"? ~ ASCII_DIGIT+ }
boolean = @{ "true" | "false" }

// Model definition
model = { "model" ~ ident ~ "{" ~ field* ~ "}" }

field        = { ident ~ field_type ~ optional? ~ attribute* }
field_type   = { ident ~ array_suffix? }
array_suffix = { "[]" }
optional     = { "?" }

// Attributes
attribute     = { "@" ~ ident ~ attr_args? }
attr_args     = { "(" ~ attr_arg_list? ~ ")" }
attr_arg_list = { attr_arg ~ ("," ~ attr_arg)* }
attr_arg      = { ident | string | number | boolean }

// API definition
api          = { "api" ~ ident ~ "{" ~ api_property* ~ "}" }
api_property = {
    ("method:" ~ http_method)
  | ("path:" ~ string)
  | ("body:" ~ ident)
  | ("response:" ~ ident)
  | ("triggers:" ~ trigger_list)
  | ("middlewares:" ~ middleware_list)
}

http_method    = { "GET" | "POST" | "PUT" | "PATCH" | "DELETE" }
trigger_list   = { "[" ~ ident ~ ("," ~ ident)* ~ "]" }
string_list    = { "[" ~ string ~ ("," ~ string)* ~ "]" }
middleware_list = { "[" ~ (ident | string) ~ ("," ~ (ident | string))* ~ "]" }

// Event definition
event          = { "event" ~ ident ~ "{" ~ event_property* ~ "}" }
event_property = {
    ("payload:" ~ ident)
  | ("handler:" ~ handler_list)
  | ("triggers:" ~ trigger_list)
  | ("type:" ~ ident)  // AWS adapter type: "sqs" or "eventbridge"
}
handler_list   = { "[" ~ ident ~ ("," ~ ident)* ~ "]" }

// Cron definition
cron          = { "cron" ~ ident ~ "{" ~ cron_property* ~ "}" }
cron_property = {
    ("schedule:" ~ string)
  | ("triggers:" ~ trigger_list)
}

// Input definition (DTO)
input       = { "input" ~ ident ~ "{" ~ input_field* ~ "}" }
input_field = { ident ~ ":" ~ field_type ~ optional? }

// WebSocket definition
ws          = { "ws" ~ ident ~ "{" ~ ws_property* ~ "}" }
ws_property = {
    ("path:" ~ string)
  | ("message:" ~ ident)
  | ("onConnect:" ~ handler_list)
  | ("onMessage:" ~ handler_list)
  | ("onDisconnect:" ~ handler_list)
  | ("triggers:" ~ trigger_list)
  | ("broadcast:" ~ boolean)
  | ("middlewares:" ~ middleware_list)
}