prost-reflect-validate

Crates.ioprost-reflect-validate
lib.rsprost-reflect-validate
version0.2.9
created_at2024-09-17 10:19:57.867628+00
updated_at2025-11-26 07:50:51.285475+00
descriptionprotoc-gen-validate's validation using prost-reflect
homepage
repositoryhttps://github.com/linka-cloud/prost-validate
max_upload_size
id1377308
size141,278
(Adphi)

documentation

https://docs.rs/prost-reflect-validate

README

crates.io docs.rs deps.rs Continuous integration Apache 2.0

prost-reflect-validate

A protobuf library extending prost and prost-reflect with validation support.

This is a rust implementation of protoc-gen-validate.

It uses the prost-reflect crate to implement validation through reflection.

For a derive based implementation see the prost-validate crate.

Usage

It must be used with prost and prost-reflect generated code.

All validation rules are documented in the proto file or in the protoc-gen-validate documentation.

Proto definition

proto/message.proto:

syntax = "proto3";

package validate.example;

import "validate/validate.proto";

message ExampleMessage {
  string content = 1 [(validate.rules).string = {const: "Hello, world!"}];
}

Build script

build.rs:

fn main() -> Result<(), Box<dyn std::error::Error>> {
    prost_reflect_build::Builder::new()
        .descriptor_pool("DESCRIPTOR_POOL")
        .compile_protos(&["message.proto"], &["proto", "../prost-validate-types/proto"])?;
    Ok(())
}

Validation

It exposes a single extension trait ValidatorExt which can be used to validate protobuf reflect messages.

src/main.rs:

use example_proto::ExampleMessage;
use prost_reflect_validate::ValidatorExt;

match ExampleMessage::default().validate() {
    Ok(_) => println!("Validation passed"),
    Err(e) => eprintln!("Validation failed: {}", e),
}
let msg = ExampleMessage {
    content: "Hello, world!".to_string(),
};
match msg.validate() {
    Ok(_) => println!("Validation passed"),
    Err(e) => eprintln!("Validation failed: {}", e),
}

Output

Validation failed: "validate.example.ExampleMessage.content": must be equal to "Hello, world!"

Validation passed

Commit count: 0

cargo fmt