# validit
[](https://discord.gg/fFPsTqYqUg)
[](https://crates.io/crates/validit)
[](https://docs.rs/validit)


Validate variable internal state when the variable is accessed.
- Implement trait `Validate` for a type `T` to define how to validate internal state of `T`.
- Wrapper struct `Valid<T: Validate>` implements `Deref` and `DerefMut` traits, and validates
the internal state when the variable is accessed.
For example, If in your program you have a struct `Foo { a: u64 }` and you want to make sure
that `a` is always less than to `10`, you can implement `Validate` trait for `Foo` and use
`less!` macro to validate `a`.
```rust
struct Foo(u64);
impl validit::Validate for Foo {
fn validate(&self) -> Result<(), Box<dyn std::error::Error>> {
validit::less!(self.0, 5);
Ok(())
}
}
fn main() {
let v1 = Valid::new(Foo(1));
let _x = v1.0; // Good.
let v6 = Foo(6);
let _x = v6.0; // No panic without validation.
let v6 = Valid::new(Foo(6));
let _x = v6.0; // panic: panicked at 'invalid state: expect: self.0(6) < 5(5) ...
}
```
## Contribution
- 🙌 Questions? Join the [Discord channel](https://discord.gg/fFPsTqYqUg) or start a [discussion](https://github.com/drmingdrmer/validit/discussions/new).