# It's a modification version based on [rust-protobuf@2.27](https://github.com/stepancheg/rust-protobuf/tree/v2.27) ## Changes - proto3 optional support # 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.