protobuf_codegen/
lib.rs

1//! # Protobuf code generator for `protobuf` crate
2//!
3//! This crate is useful mostly from `build.rs` scripts to generate `.rs` files during the build.
4//!
5//! # How to generate code
6//!
7//! There are three main ways to generate `.rs` files from `.proto` files:
8//! * using `protoc` command line tool and `protoc-gen-rs` plugin
9//! * using this crate `Codegen` with pure rust parser
10//! * using this crate `Codegen` with `protoc` parser
11//!
12//! Which one should you use depends on your needs.
13//!
14//! If you are using non-cargo build system (like Bazel), you might prefer
15//! using `protoc-gen-rs` plugin for `protoc`.
16//!
17//! If you build with `cargo`, you probably want to use `Codegen` from this crate.
18//!
19//! # Protoc parser vs pure rust parser
20//!
21//! There are two protobuf parsers which can be plugged into this crate:
22//! * `protoc`-based parser (`protoc` is a command like utility from Google protobuf)
23//! * pure rust parser (`protobuf-parse` crate)
24//!
25//! `protoc`-based parser is expected to parse `.proto` files very correctly:
26//! all Google's protobuf implementations rely on it.
27//!
28//! While there are no known bugs in `protobuf-parse`, it is not tested very well.
29//! Also `protobuf-parse` does not implement certain rarely used features of `.proto` parser,
30//! mostly complex message options specified in `.proto` files.
31//! I never saw anyone using them, but you have been warned.
32//!
33//! Note `protoc` command can be obtained from
34//! [`protoc-bin-vendored`](https://docs.rs/protoc-bin-vendored) crate.
35//!
36//! # Example
37//!
38//! ```no_run
39//! # mod protoc_bin_vendored {
40//! #   pub fn protoc_bin_path() -> Result<std::path::PathBuf, std::io::Error> {
41//! #       unimplemented!()
42//! #   }
43//! # }
44//! // Use this in build.rs
45//! protobuf_codegen::Codegen::new()
46//!     // Use `protoc` parser, optional.
47//!     .protoc()
48//!     // Use `protoc-bin-vendored` bundled protoc command, optional.
49//!     .protoc_path(&protoc_bin_vendored::protoc_bin_path().unwrap())
50//!     // All inputs and imports from the inputs must reside in `includes` directories.
51//!     .includes(&["src/protos"])
52//!     // Inputs must reside in some of include paths.
53//!     .input("src/protos/apple.proto")
54//!     .input("src/protos/banana.proto")
55//!     // Specify output directory relative to Cargo output directory.
56//!     .cargo_out_dir("protos")
57//!     .run_from_script();
58//! ```
59//!
60//! ## How to use `protoc-gen-rs`
61//!
62//! If you have to.
63//!
64//! (Note `protoc` can be invoked programmatically with
65//! [protoc crate](https://docs.rs/protoc/))
66//!
67//! 0) Install protobuf for `protoc` binary.
68//!
69//! On OS X [Homebrew](https://github.com/Homebrew/brew) can be used:
70//!
71//! ```sh
72//! brew install protobuf
73//! ```
74//!
75//! On Ubuntu, `protobuf-compiler` package can be installed:
76//!
77//! ```sh
78//! apt-get install protobuf-compiler
79//! ```
80//!
81//! Protobuf is needed only for code generation, `rust-protobuf` runtime
82//! does not use C++ protobuf library.
83//!
84//! 1) Install `protoc-gen-rs` program (which is `protoc` plugin)
85//!
86//! It can be installed either from source or with `cargo install protobuf-codegen` command.
87//!
88//! 2) Add `protoc-gen-rs` to $PATH
89//!
90//! If you installed it with cargo, it should be
91//!
92//! ```sh
93//! PATH="$HOME/.cargo/bin:$PATH"
94//! ```
95//!
96//! 3) Generate .rs files:
97//!
98//! ```sh
99//! protoc --rs_out . foo.proto
100//! ```
101//!
102//! This will generate .rs files in current directory.
103//!
104//! # Customize generate code
105//!
106//! Sometimes generated code need to be adjusted, e. g. to have custom derives.
107//!
108//! rust-protobuf provides two options to do that:
109//! * generated `.rs` files contain `@@protoc_insertion_point(...)` markers
110//!   (similar markers inserts Google's protobuf generator for C++ or Java).
111//!   Simple script `sed` one-liners can be used to replace these markers with custom annotations.
112//! * `Codegen::customize_callback` can be used to patch generated code
113//!   when invoked from `build.rs` script.
114//!
115//! # Serde
116//!
117//! rust-protobuf since version 3 no longer directly supports serde.
118//!
119//! Rust-protobuf 3 fully supports:
120//! * runtime reflection
121//! * JSON parsing and printing via
122//!  [`protobuf-json-mapping`](https://docs.rs/protobuf-json-mapping)
123//!
124//! Which covers the most of serde use cases.
125//!
126//! If you still need serde, generic customization callback (see above) can be used
127//! to insert `#[serde(...)]` annotations.
128//!
129//! [Example project](https://github.com/stepancheg/rust-protobuf/tree/master/protobuf-examples/customize-serde)
130//! in the rust-protobuf repository demonstrates how to do it.
131
132#![deny(rustdoc::broken_intra_doc_links)]
133
134mod codegen;
135mod compiler_plugin;
136mod customize;
137mod gen;
138pub mod gen_and_write;
139pub mod protoc_gen_rs;
140
141pub use codegen::Codegen;
142pub use customize::Customize;
143pub use customize::CustomizeCallback;
144#[doc(hidden)]
145pub use gen::paths::proto_name_to_rs;