# prost-protovalidate
[](https://crates.io/crates/prost-protovalidate)
[](https://docs.rs/prost-protovalidate)
[](LICENSE-MIT)
[](https://blog.rust-lang.org/2025/04/03/Rust-1.86.0.html)
Runtime validation for Protocol Buffer messages using [buf.validate](https://github.com/bufbuild/protovalidate) rules, built for `prost` and `prost-reflect`.
Dynamically inspects `prost-reflect` message descriptors, compiles `buf.validate` constraint annotations (including CEL expressions), and evaluates them against concrete message instances.
## Quick Start
```toml
[dependencies]
prost = "0.14"
prost-protovalidate = "0.1"
```
Annotate your `.proto` files with `buf.validate` rules:
```protobuf
syntax = "proto3";
import "buf/validate/validate.proto";
message CreateUserRequest {
string name = 1 [(buf.validate.field).string.min_len = 1];
int32 age = 2 [(buf.validate.field).int32.gte = 18];
}
```
Validate in Rust:
```rust
use prost_protovalidate::validate;
let request = CreateUserRequest {
name: "Alice".to_string(),
age: 25,
};
match validate(&request) {
Ok(()) => println!("Validation passed!"),
Err(e) => println!("Validation failed: {e}"),
}
```
For repeated validations, construct a `Validator` once to cache compiled rules:
```rust
use prost_protovalidate::Validator;
let validator = Validator::new();
validator.validate(&request)?;
```
## Features
- **Dynamic field inspection** via `prost-reflect` descriptors — no static code generation needed for validators.
- **CEL evaluation** — compiles and evaluates Common Expression Language expressions for cross-field and complex constraints.
- **Aggregated violations** — collects all constraint failures instead of short-circuiting on the first error.
- **Evaluation caching** — `Validator` caches compiled AST/CEL rules, avoiding re-parsing on every call.
## Compatibility
| 0.1.x | 0.14 | 0.16 | 1.86 |
## License
[MIT](LICENSE-MIT) OR [Apache-2.0](LICENSE-APACHE)