prost-reflect-validate 0.1.0

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

A protobuf library extending [prost](https://github.com/tokio-rs/prost)
and [prost-reflect](https://github.com/andrewhickman/prost-reflect) with validation support.

This a rust implementation [protoc-gen-validate](https://github.com/bufbuild/protoc-gen-validate).

## Usage

It currently supports validation using reflection.

It must be used with [prost](https://github.com/tokio-rs/prost) 
and [prost-reflect](https://github.com/andrewhickman/prost-reflect) generated code.

All validation rules are documented in the [proto file](prost-reflect-validate/proto/validate/validate.proto) 
or in the [protoc-gen-validate](https://github.com/bufbuild/protoc-gen-validate/blob/v1.1.0/README.md#constraint-rules) documentation.

**Proto definition**

```protobuf
syntax = "proto3";

package validate.example;

import "validate/validate.proto";

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

**Validation**

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

```rust
mod proto {
    use once_cell::sync::Lazy;
    use prost_reflect::DescriptorPool;

    static DESCRIPTOR_POOL: Lazy<DescriptorPool> = Lazy::new(|| DescriptorPool::decode(include_bytes!(concat!(env!("OUT_DIR"), "/file_descriptor_set.bin")).as_ref()).unwrap());
    include!(concat!(env!("OUT_DIR"), "/validate.example.rs"));
}

fn main() {
    use prost_reflect_validate::ValidatorExt;
    use crate::proto::ExampleMessage;

    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),
    }
}
```

**Ouput**

```
Validation failed: validate.example.ExampleMessage.content: must be Hello, world!
Validation passed
```

## Minimum Supported Rust Version

Rust **1.64** or higher.

The minimum supported Rust version may be changed in the future, but it will be
done with a minor version bump.