An implementation of the protobuf compiler in rust, intended for use as a library with crates such as prost-build
to avoid needing to build protoc
.
Compiling a single source file:
assert_eq!(protox::compile(["root.proto"], ["."]).unwrap(), FileDescriptorSet {
file: vec![
FileDescriptorProto {
name: Some("root.proto".to_owned()),
/* ... */
}
],
});
Usage with prost-build
:
let file_descriptors = protox::compile(["root.proto"], ["."]).unwrap();
prost_build::compile_fds(file_descriptors).unwrap();
Usage with tonic-build
:
let file_descriptors = protox::compile(["root.proto"], ["."]).unwrap();
tonic_build::configure()
.build_server(true)
.compile_fds(file_descriptors)
.unwrap();
This crate uses miette
to add additional details to errors. For nice error messages, add miette
as a dependency with the fancy
feature enabled and return a miette::Result
from your build script.
fn main() -> miette::Result<()> {
let _ = protox::compile(["root.proto"], ["."])?;
Ok(())
}
Example error message:
Error:
× name 'Bar' is not defined
╭─[root.proto:3:1]
3 │ message Foo {
4 │ Bar bar = 1;
· ─┬─
· ╰── found here
5 │ }
╰────
Rust 1.74 or higher.
The minimum supported Rust version may be changed in the future, but it will be done with a minor version bump.
Licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.