#validation #protobuf #prost #reflection #proto #protoc-gen-validate #rules

prost-reflect-validate

protoc-gen-validate's validation using prost-reflect

8 releases

0.2.6 Oct 16, 2024
0.2.5 Oct 15, 2024
0.1.0 Sep 22, 2024
0.0.1 Sep 17, 2024

#965 in Encoding

50 downloads per month

Apache-2.0

150KB
4K SLoC

crates.io docs.rs deps.rs MSRV 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

Minimum Supported Rust Version

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.

Dependencies

~8–16MB
~222K SLoC