A pure Rust library to serialize/deserialize protobuf files.
This library intends to provide a simple yet fast (minimal allocations) protobuf parser implementation.
It provides both:
- pb-rs, a code generation tool:
- each .proto
file will generate a minimal rust module (one function to read, one to write, and one to compute the size of the messages)
- each message will generate a rust struct where:
- bytes
fields are converted to Cow::Borrowed([u8])
- string
fields are converted to Cow::Borrowed(str)
- repeated
fields are converted to Vec
- all other fields are converted into the matching rust primitive type
- no need to use google protoc
tool to generate the modules
- quick-protobuf, a protobuf file parser:
- this is the crate that you will typically refer to in your library. The generated modules will assume it has been imported.
- it acts like an event parser, the logic to convert it into struct is handle by pb-rs
pb-rs
binary, located into codegen
directory to automatically generate a foobar.rs module from a foobar.proto proto filesh
git clone https://github.com/tafia/quick-protobuf
cd quick-protobuf/codegen
cargo run ../../protobuf_example/foo_bar.proto
cd ../../protobuf_example
```toml
[dependencies] quick-protobuf = "0.1.0" ```
```rust // main.rs or lib.rs extern crate quick_protobuf;
mod foo_bar; // (see 1.)
use quick_protobuf::Reader;
// We will suppose here that Foo and Bar are two messages defined in the .proto file // and converted into rust structs // // FooBar is the root message defined like this: // message FooBar { // repeated Foo foos = 1; // repeated Bar bars = 2; // } use foo_bar::{FooBar};
fn main() { // create a reader, which will parse the protobuf binary file and pop events // this reader will read the entire file into an internal buffer let mut reader = Reader::from_file("/path/to/binary/protobuf.bin") .expect("Cannot read input file");
// use the generated module fns with the reader to convert your data into rust structs
let foobar = reader.read(FooBar::from_reader).expect("Cannot read FooBar message");
println!("Found {} foos and {} bars!", foobar.foos.len(), foobar.bars.len());
} ```
This library is an alternative to the widely used rust-protobuf. If you want to build anything serious, I strongly advise against using quick-protobuf which is very immature for the moment.
Pros
Cons
Option
s unwrapping yourselfCow
as well is you want to modify itHave a look at the different generated modules for the same .proto file: - rust-protobuf: 2322 loc - quick-protobuf: 300 loc
The only implemented benchmarks are the adaptation from rust-protobuf perftest.
Any help is welcomed! (Pull requests of course, bug report, missing functionality etc...)
MIT