proto-file-parser 0.1.1

A Protocol Buffer Definition (.proto) parser that converts proto files to JSON format
Documentation
WHITESPACE = _{ " " | "\t" | "\r" | "\n" }
COMMENT = _{ "//" ~ (!"\n" ~ ANY)* | "/*" ~ (!"*/" ~ ANY)* ~ "*/" }

// Main file structure
proto_file = {
    SOI ~
    (syntax | package | import | message_def | enum_def | service_def)* ~
    EOI
}

// Basic elements
ident = @{ ASCII_ALPHA ~ (ASCII_ALPHANUMERIC | "_")* }
number = @{ ASCII_DIGIT+ }
string_lit = ${ "\"" ~ inner_str ~ "\"" }
inner_str = @{ (!("\"" | "\\") ~ ANY)* }
full_ident = @{ ident ~ ("." ~ ident)* }

// Syntax definition
syntax = { "syntax" ~ "=" ~ string_lit ~ ";" }

// Package definition
package = { "package" ~ full_ident ~ ";" }

// Import statement
import = { "import" ~ string_lit ~ ";" }

// Message definition
message_def = {
    "message" ~
    ident ~
    "{" ~
    message_element* ~
    "}"
}

message_element = _{
    field |
    enum_def |
    message_def |
    ";"
}

// Field definition
field = {
    field_rule? ~
    (primitive_type | ident) ~
    ident ~
    "=" ~
    number ~
    ";"
}

field_rule = { "repeated" | "optional" | "required" }

primitive_type = {
    "double" | "float" | "int32" | "int64" | "uint32" | "uint64" |
    "sint32" | "sint64" | "fixed32" | "fixed64" | "sfixed32" |
    "sfixed64" | "bool" | "string" | "bytes"
}

// Enum definition
enum_def = {
    "enum" ~
    ident ~
    "{" ~
    enum_value* ~
    "}"
}

enum_value = {
    ident ~
    "=" ~
    number ~
    ";"
}

// Service definition
service_def = {
    "service" ~
    ident ~
    "{" ~
    rpc_def* ~
    "}"
}

rpc_def = {
    "rpc" ~
    ident ~
    "(" ~
    message_type ~
    ")" ~
    "returns" ~
    "(" ~
    message_type ~
    ")" ~
    (";" | "{" ~ "}")
}

message_type = { "stream"? ~ ident }