prost-reflect-validate

Crates.ioprost-reflect-validate
lib.rsprost-reflect-validate
version0.2.6
sourcesrc
created_at2024-09-17 10:19:57.867628
updated_at2024-10-16 08:43:44.92685
descriptionprotoc-gen-validate's validation using prost-reflect
homepage
repositoryhttps://github.com/linka-cloud/prost-validate
max_upload_size
id1377308
size120,177
(Adphi)

documentation

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

README

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.

Commit count: 41

cargo fmt