Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/andrewhickman/protox
A pure-rust protobuf compiler, designed for use with prost-build
https://github.com/andrewhickman/protox
compiler protobuf rust
Last synced: 3 months ago
JSON representation
A pure-rust protobuf compiler, designed for use with prost-build
- Host: GitHub
- URL: https://github.com/andrewhickman/protox
- Owner: andrewhickman
- License: apache-2.0
- Created: 2022-02-17T21:37:56.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2024-08-05T13:19:05.000Z (3 months ago)
- Last Synced: 2024-08-06T10:23:39.061Z (3 months ago)
- Topics: compiler, protobuf, rust
- Language: Rust
- Homepage:
- Size: 790 KB
- Stars: 60
- Watchers: 4
- Forks: 4
- Open Issues: 6
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE-APACHE
Awesome Lists containing this project
README
[![crates.io](https://img.shields.io/crates/v/protox.svg)](https://crates.io/crates/protox/)
[![docs.rs](https://docs.rs/protox/badge.svg)](https://docs.rs/protox/)
[![deps.rs](https://deps.rs/crate/protox/0.7.0/status.svg)](https://deps.rs/crate/protox)
![MSRV](https://img.shields.io/badge/rustc-1.70+-blue.svg)
[![Continuous integration](https://github.com/andrewhickman/protox/actions/workflows/ci.yml/badge.svg)](https://github.com/andrewhickman/protox/actions/workflows/ci.yml)
[![codecov](https://codecov.io/gh/andrewhickman/protox/branch/main/graph/badge.svg?token=9YKHGUUPUX)](https://codecov.io/gh/andrewhickman/protox)
![Apache 2.0 OR MIT licensed](https://img.shields.io/badge/license-Apache2.0%2FMIT-blue.svg)# protox
An implementation of the protobuf compiler in rust, intended for use as a library with crates such as [`prost-build`](https://crates.io/crates/prost-build) to avoid needing to build `protoc`.
## Examples
Compiling a single source file:
```rust
assert_eq!(protox::compile(["root.proto"], ["."]).unwrap(), FileDescriptorSet {
file: vec![
FileDescriptorProto {
name: Some("root.proto".to_owned()),
/* ... */
}
],
});
```Usage with [`prost-build`](https://crates.io/crates/prost-build):
```rust
let file_descriptors = protox::compile(["root.proto"], ["."]).unwrap();
prost_build::compile_fds(file_descriptors).unwrap();
```Usage with [`tonic-build`](https://crates.io/crates/tonic-build):
```rust
let file_descriptors = protox::compile(["root.proto"], ["."]).unwrap();let file_descriptor_path = PathBuf::from(env::var_os("OUT_DIR").expect("OUT_DIR not set"))
.join("file_descriptor_set.bin");
fs::write(&file_descriptor_path, file_descriptors.encode_to_vec()).unwrap();tonic_build::configure()
.build_server(true)
.file_descriptor_set_path(&file_descriptor_path)
.skip_protoc_run()
.compile(&["root.proto"], &["."])
.unwrap();
```### Error messages
This crate uses [`miette`](https://crates.io/crates/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`](https://docs.rs/miette/latest/miette/type.Result.html) from your build script.
```rust
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 │ }
╰────
```## Minimum Supported Rust Version
Rust **1.70** or higher.
The minimum supported Rust version may be changed in the future, but it will be
done with a minor version bump.## License
Licensed under either of
* Apache License, Version 2.0
([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
* MIT license
([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)at your option.
This project includes code imported from the Protocol Buffers project, which is
included under its original ([BSD][2]) license.[2]: https://github.com/protocolbuffers/protobuf/blob/master/LICENSE
## Contribution
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.