prost_protovalidate/lib.rs
1//! Runtime validation for Protocol Buffer messages using
2//! [`buf.validate`](https://github.com/bufbuild/protovalidate) rules.
3//!
4//! This crate dynamically inspects `prost-reflect` message descriptors at runtime,
5//! compiles `buf.validate` constraint annotations (including CEL expressions),
6//! and evaluates them against concrete message instances.
7//!
8//! # Quick start
9//!
10//! For one-off validation, use the [`validate`] convenience function:
11//!
12//! ```rust,no_run
13//! use prost_protovalidate::validate;
14//! # fn example(msg: impl prost_reflect::ReflectMessage) {
15//! match validate(&msg) {
16//! Ok(()) => { /* message is valid */ }
17//! Err(e) => eprintln!("validation failed: {e}"),
18//! }
19//! # }
20//! ```
21//!
22//! For repeated validations, construct a [`Validator`] once to cache compiled
23//! rules across calls:
24//!
25//! ```rust,no_run
26//! use prost_protovalidate::Validator;
27//! # fn example(msg: impl prost_reflect::ReflectMessage) {
28//! let validator = Validator::new();
29//! validator.validate(&msg).expect("message should be valid");
30//! # }
31//! ```
32//!
33//! # Error types
34//!
35//! | Type | When |
36//! |------|------|
37//! | [`ValidationError`] | One or more constraint violations detected |
38//! | [`CompilationError`] | A CEL expression or constraint definition failed to parse |
39//! | [`RuntimeError`] | An unexpected failure during evaluation |
40//!
41//! All three are unified under [`Error`].
42//!
43//! # Re-exported types
44//!
45//! The [`types`] module re-exports [`prost-protovalidate-types`](https://crates.io/crates/prost-protovalidate-types)
46//! so consumers do not need to depend on it directly.
47
48#![warn(missing_docs)]
49
50mod config;
51mod error;
52mod validator;
53mod violation;
54
55/// Re-export of [`prost-protovalidate-types`](https://crates.io/crates/prost-protovalidate-types)
56/// for accessing generated `buf.validate` proto types and descriptor pool.
57pub use prost_protovalidate_types as types;
58
59pub use config::{Filter, ValidationOption, ValidatorOption};
60pub use error::{CompilationError, Error, RuntimeError, ValidationError};
61pub use validator::{Validator, validate};
62pub use violation::Violation;
63
64/// Normalize protobuf Edition 2023 descriptors to proto3 format for
65/// compatibility with `prost-reflect` 0.16 which does not support editions.
66pub use validator::editions::normalize_edition_descriptor_set;