C++ compiler in Node.js for ProtoDef schemas, a lighter and more versatile alternative to Protocol Buffers or FlatBuffers that can support any binary format.
See the ProtoDef specification at https://github.com/ProtoDef-io/ProtoDef.
- Header-only : No dependencies other than the C or C++ standard libraries
- Arrays, enums, nested structures, optional fields, variable-length integers/strings, custom types, etc. See ProtoDef spec for more details
- Built-in support for dumping JSON for utility/debugging on top of binary encode/decode
npm install protodef-cppFeed the CLI tool a .json or .yaml file, and optionally specify a directory to write the generated files to. Two header files will be written: a "streams.h", containing a binary stream implementation used by the encoder/decoder (if you don't already have one), and a "protocol.h" header file (name will vary depending on your input name), containing the generated encoder/decoder code.
$ npxprotodef-cpp--helpprotodef-cpp-v1.0.0protodef-cpp-AC++compilerforProtoDefschemasOptions:
--input, -iPathtoProtoDefJSON/YAMLfilewithprotocoldata--lang, -lWhatlanguageusecompile to. CurrentlyonlyC++. (default: cpp)
--outputOutputfolder (default: ./)
--config, -tPathtoJSfilewhoseexportswillbemergedintothecurrentoptions, whichallowsyoutodefinecustomtypesand variables.
--namespaceWhatnamespacetouse, usefulifyouhavemultipleprotocols. (default: proto)If you have multiple protocols specified inside one JSON file, please use the programmatic API instead (example).
constprotodefCpp=require('protodef-cpp')protodefCpp.compile({inputFile: 'protocol.json',outputFolder: './',lang: 'cpp',namespace: 'proto',})protocol.yml:
string: ["pstring", { countType: "varint" }]packet_video_stream_connect:
server_uri: stringframe_send_frequency: lf32action: u8 =>1: none2: closeresolution_x: li32resolution_y: li32Command line:
npx protodef-cpp -i protocol.yml --lang cppDone! You should now have a "protocol.h" file in your current directory. Here's how you would encode a structure:
#include"protocol.h"intmain () {
pdef::proto::packet_video_stream_connect packet {
.server_uri = "wss://example.com",
.frame_send_frequency = 60.0f,
.action = pdef::proto::packet_video_stream_connect::Action::None,
.resolution_x = 1920,
.resolution_y = 1080,
};
pdef::Stream stream(0);
pdef::proto::encode::packet_video_stream_connect(stream, packet);
stream.dumpToStdout();
return0;
}See examples/ for more examples.
protodef-cpp does not support root level switches, or $ variables. Some preprocessing is done to inline root level switches, but for $ variables, some complex use-cases may not work. Please update the schema to not use $ variables if you encounter any issues.