# Library to read and write protocol buffers data
# Version 2 is stable
Currently developed branch of rust-protobuf [is 3](https://docs.rs/protobuf/%3E=3.0.0-alpha).
It has the same spirit as version 2, but contains numerous improvements like:
* runtime reflection for mutability, not just for access
* protobuf text format and JSON parsing (which rely on reflection)
* dynamic message support: work with protobuf data without generating code from schema
Stable version of rust-protobuf will be supported until version 3 released.
[Tracking issue for version 3](https://github.com/stepancheg/rust-protobuf/issues/518).
# How to generate rust code
There are several ways to generate rust code from `.proto` files
## Invoke `protoc` programmatically with protoc-rust crate (recommended)
Have a look at readme in [protoc-rust crate](https://docs.rs/protoc-rust/=2).
## Use pure rust protobuf parser and code generator
Readme should be in
[protobuf-codegen-pure crate](https://docs.rs/protobuf-codegen-pure/=2).
## Use protoc-gen-rust plugin
Readme is [here](https://docs.rs/protobuf-codegen/=2).
## Generated code
Have a look at generated files (for current development version),
used internally in rust-protobuf:
* [descriptor.rs](https://github.com/stepancheg/rust-protobuf/blob/master/protobuf/src/descriptor.rs)
for [descriptor.proto](https://github.com/stepancheg/rust-protobuf/blob/master/protoc-bin-vendored/include/google/protobuf/descriptor.proto)
(that is part of Google protobuf)
# Copy on write
Rust-protobuf can be used with [bytes crate](https://github.com/tokio-rs/bytes).
To enable `Bytes` you need to:
1. Enable `with-bytes` feature in rust-protobuf:
```rust
[dependencies]
protobuf = { version = "~2.0", features = ["with-bytes"] }
```
2. Enable bytes option
with `Customize` when codegen is invoked programmatically:
```rust
protoc_rust::run(protoc_rust::Args {
...
customize: Customize {
carllerche_bytes_for_bytes: Some(true),
carllerche_bytes_for_string: Some(true),
..Default::default()
},
});
```
or in `.proto` file:
```rust
import "rustproto.proto";
option (rustproto.carllerche_bytes_for_bytes_all) = true;
option (rustproto.carllerche_bytes_for_string_all) = true;
```
With these options enabled, fields of type `bytes` or `string` are
generated as `Bytes` or `Chars` respectively. When `CodedInputStream` is constructed
from `Bytes` object, fields of these types get subslices of original `Bytes` object,
instead of being allocated on heap.
# Accompanying crates
* [`protoc-rust`](https://docs.rs/protoc-rust/=2)
and [`protobuf-codegen-pure`](https://docs.rs/protobuf-codegen-pure/=2)
can be used to rust code from `.proto` crates.
* [`protobuf-codegen`](https://docs.rs/protobuf-codegen/=2) for `protoc-gen-rust` protoc plugin.
* [`protoc`](https://docs.rs/protoc/=2) crate can be used to invoke `protoc` programmatically.
* [`protoc-bin-vendored`](https://docs.rs/protoc-bin-vendored/=2) contains `protoc` command
packed into the crate.