protify 0.1.4

A Rust-first protobuf framework to generate packages from rust code, with validation included
Documentation
# Enforcing Correctness

This crate tries to enforce correctness as at compile/testing time, so that badly set up validators do not make their way into runtime.

The [`Validator`](crate::Validator) trait holds a method called [`check_consistency`](crate::Validator::check_consistency) which checks if the inputs inside of it make sense or were caused by an error. All provided validators implement this method and perform a variety of checks on their inputs, and all custom validators can optionally implement it too. For example, the [`StringValidator`](crate::StringValidator) will:

- Check if `max_len` is less than `min_len`
- Check if `prefix` or `suffix` match the `not_contains` rule
- Check if an item is both in the lists of allowed and forbidden values
- ...and many others

Whereas the [`EnumValidator`](crate::EnumValidator) will perform checks like ensuring that all the values in the `in` rule are actually defined in the target enum.

All provided validators as a whole will:

- Check the validity of CEL expressions used in them
- Check if a custom error message is defined but never used
- Check if the `const` rule is used along with other rules (which would be ignored)

There is a particular emphasis on checking the validity of CEL expressions because they are written as plain text and are very easy to get wrong, and they **will panic** at initialization if they fail to compile.

Unless specified otherwise with the `skip_checks` attribute, the macros will generate a test that calls this method for every validator assigned to a message/oneof, and panics on failure.

```rust
use protify::*;

let bad_validator = StringValidator::builder().min_len(10).max_len(3).build();

assert!(bad_validator.check_consistency().is_err());
```