/lua-pb

Lua Protocol Buffers

Primary LanguageLuaMIT LicenseMIT

lua-pb

Lua Protocol Buffers.

Supports dynamic loading of Protocol Buffer message definition files .proto

Installing

$ sudo luarocks install "https://raw.github.com/Neopallium/lua-pb/master/lua-pb-scm-0.rockspec"

Design

Frontend .proto definition file parser:

  • pb/proto/scanner.lua -- LPeg lexer for .proto files.
  • pb/proto/util.lua -- some utility functions.
  • pb/proto/grammar.lua -- LPeg grammar for .proto files.
  • pb/proto/parser.lua -- LPeg based .proto -> AST tree parser.

There can be multiple Backend message definition compilers. An optimized backend for LuaJIT is planned.

Standard backend compiler

  • pb/standard.lua -- main compiler code.
  • pb/handlers.lua -- a helper object for managing registered encode/decode formats.
  • pb/standard/message.lua -- defines message interface.
  • pb/standard/repeated.lua -- defines repeated field interface.
  • pb/standard/pack.lua -- binary format encoding (Uses modules luabitops & struct)
  • pb/standard/unpack.lua -- binary format decoding (Uses modules luabitops & struct)
  • pb/standard/buffer.lua -- encoding buffer
  • pb/standard/unknown.lua -- object for hold unknown fields.
  • pb/standard/dump.lua -- message dumping code.

Finished

  • .proto definition parser
  • Message encoding/decoding
  • Dumping messages to text format.
  • Support for packing/unpacking unknown fields.

TODO

  • rename pb/handlers.lua to pb/formats.lua

Missing features:

  • custom options:

    import "google/protobuf/descriptor.proto";

    extend google.protobuf.MessageOptions { optional string my_option = 51234; }

    message MyMessage { option (my_option) = "Hello world!"; }

  • services

Improvements:

  • store unknown fields as raw binary, only fully decode when accessed.
  • LuaJIT optimized backend compiler.