prost-validate-build

Crates.ioprost-validate-build
lib.rsprost-validate-build
version0.2.6
sourcesrc
created_at2024-10-09 17:10:41.169131
updated_at2024-10-16 08:43:17.330995
descriptionprotoc-gen-validate's validation generation using prost-build
homepage
repositoryhttps://github.com/linka-cloud/prost-validate
max_upload_size
id1402757
size17,300
(Adphi)

documentation

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

README

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

prost-validate-build

A protobuf library extending prost with validation support.

prost-validate-build is a crate that can be used to generate protobuf message validation from protoc-gen-validate annotations.

This crate is intended to be used in a build.rs script to generate the validation code for the messages.

It depends on the prost-validate crate's derive feature to generate the validation code.

Usage

It can be used to compile the .proto files into Rust using prost-build or to simply generate the prost-build configuration.

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

cargo add prost-validate --features derive
cargo add prost-validate-build --build

Example Protobuf definition

proto/message.proto:

syntax = "proto3";

package validate.example;

import "validate/validate.proto";

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

Generating Rust code with validation

build.rs:

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

Generating prost-build configuration for usage with other generators

Example for prost-reflect-build

build.rs:

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let files = &["message.proto"];
    let includes = &["proto", "../prost-validate-types/proto"];

    let mut config = prost_build::Config::new();

    prost_validate_build::Builder::new().configure(&mut config, files, includes)?;

    prost_reflect_build::Builder::new()
        .descriptor_pool("DESCRIPTOR_POOL")
        .compile_protos_with_config(config, files, includes)?;

    Ok(())
}

Include the generated code

include!(concat!(env!("OUT_DIR"), "/validate.example.rs"));

Using the generated code

fn main() {
    use example_proto::ExampleMessage;
    use prost_validate::Validator;

    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: 41

cargo fmt