pp

proto-parse

Utility to parse a proto file, which describes a Google protocol buffer.

Showing:

Popularity

Downloads/wk

43

GitHub Stars

11

Maintenance

Last Commit

2yrs ago

Contributors

1

Package

Dependencies

0

Size (min+gzip)

5.9KB

License

ISC

Type Definitions

Tree-Shakeable

No?

Categories

Readme

proto-parse

proto-parse is a simple utility to parse a proto file describing a Google Protocol Buffer. Look here for more information on Proto Buffers. This is yet just a simple wrapper around a parser generated by peg.js. It is optimized for proto3 files and yet does not work for proto2. This parser strictly follows the proto 3 specs from Google;

TODO

  • Add proto2 support
  • Do more checking, e.g. check whether userdefined type really exists.
  • Check stream support in services. Documentation does not specify the syntax, so I am waiting for Google to fix this.
  • Add better reserved support

Please feel free to request any feature on github.

Usage

const parse = require('proto-parse');
var data = parse(fs.readFileSync('example.proto').toString());

No options or other parameters are currently used. Just pass the string containing the proto description to the function.

Returns

The function returns an array containing the following elements.

{
    syntax: "proto3",
    content: [
        // Top Level Elements, see below
    ]
}

Package

{
  "type": "package",
  "package": "MyCompany.MyPackage"
}

Service

{
    "type": "service",
    "name": "a",
    "content": [ // Containing RPCs
        ...
    ]
}

RPC

{
    "type": "rpc",
    "name": "MyRPC",
    "param":, ... // Containing type of param
    "returns": ... // Containing type of return value
}

Message

{
  "type": "message",
  "name": "MY_MESSAGE" // Name of the message
  "content": [ // is an array containing messages, fields, enums
     ...
  ]

}

Type

{
    "type": "userdef", // userdef, primitive or map
    "typename": "abc" // Name of the type
}

Special case map

map<int32, string> bla = 1;

results in:

{
    "type": "field",
    "typename": "map",
    "key": "int32",
    "value": "string",
    "name": "bla",
    "fieldNo": 1,
    "opts": {}
}

Example

syntax = "proto3";

message SearchRequest {
    string query = 1;
    int32 page_number = 2;
    int32 result_per_page = 3;
    message Exmpl{
        oneof test_oneof {
            string name = 4;
            SubMessage sub_message = 9;
        }
    }
    enum Corpus {
        UNIVERSAL = 0;
        WEB = 1;
        IMAGES = 2;
        LOCAL = 3;
        NEWS = 4;
        PRODUCTS = 5;
        VIDEO = 6;
    }
    Corpus corpus = 4;
    map<int32, string> bla = 1;
    repeated Exmpl results = 1;
    reserved 2, 15, 9 to 11;
}

turns into:

{
  "syntax": "proto3",
  "content": [
    {
      "type": "message",
      "name": "SearchRequest",
      "content": [
        {
          "type": "field",
          "repeated": false,
          "typename": "string",
          "name": "query",
          "fieldNo": 1,
          "opts": {}
        },
        {
          "type": "field",
          "repeated": false,
          "typename": "int32",
          "name": "page_number",
          "fieldNo": 2,
          "opts": {}
        },
        {
          "type": "field",
          "repeated": false,
          "typename": "int32",
          "name": "result_per_page",
          "fieldNo": 3,
          "opts": {}
        },
        {
          "type": "message",
          "name": "Exmpl",
          "content": [
            {
              "type": "oneof",
              "name": "test_oneof",
              "content": [
                {
                  "type": "field",
                  "typename": "string",
                  "name": "name",
                  "fieldNo": 4,
                  "opts": {}
                },
                {
                  "type": "field",
                  "typename": "SubMessage",
                  "name": "sub_message",
                  "fieldNo": 9,
                  "opts": {}
                }
              ]
            }
          ],
          "opts": {}
        },
        {
          "type": "enum",
          "name": "Corpus",
          "content": [
            {
              "type": "enumField",
              "name": "UNIVERSAL",
              "val": 0,
              "opts": {}
            },
            {
              "type": "enumField",
              "name": "WEB",
              "val": 1,
              "opts": {}
            },
            {
              "type": "enumField",
              "name": "IMAGES",
              "val": 2,
              "opts": {}
            },
            {
              "type": "enumField",
              "name": "LOCAL",
              "val": 3,
              "opts": {}
            },
            {
              "type": "enumField",
              "name": "NEWS",
              "val": 4,
              "opts": {}
            },
            {
              "type": "enumField",
              "name": "PRODUCTS",
              "val": 5,
              "opts": {}
            },
            {
              "type": "enumField",
              "name": "VIDEO",
              "val": 6,
              "opts": {}
            }
          ],
          "opts": {}
        },
        {
          "type": "field",
          "repeated": false,
          "typename": "Corpus",
          "name": "corpus",
          "fieldNo": 4,
          "opts": {}
        },
        {
          "type": "field",
          "typename": "map",
          "key": "int32",
          "value": "string",
          "name": "bla",
          "fieldNo": 1,
          "opts": {}
        },
        {
          "type": "field",
          "repeated": true,
          "typename": "Exmpl",
          "name": "results",
          "fieldNo": 1,
          "opts": {}
        }
      ],
      "opts": {}
    }
  ]
}

Changes

  • v0.0.1 Initial commit.
  • v0.0.2 Just fixed some bugs in the Readme file.
  • v0.0.4 Fixed comment parsing
  • v0.0.5 Bugfix: Fieldno with more than two digits is not correctly parsed. Added example in README.

Rate & Review

Great Documentation0
Easy to Use0
Performant0
Highly Customizable0
Bleeding Edge0
Responsive Maintainers0
Poor Documentation0
Hard to Use0
Slow0
Buggy0
Abandoned0
Unwelcoming Community0
100