Skip to main content

Validator

Trait Validator 

Source
pub trait Validator<T: ?Sized> {
    type Error;

    // Required method
    fn validate(value: &T) -> Result<(), Self::Error>;
}
Expand description

A reusable validation rule applied to values of type T.

A Validator is a type-level predicate. It carries no state and is never instantiated — you implement it on a zero-sized marker type and the rule is selected purely through the type system. Pairing a value with the validator that vouched for it is exactly what Refined does, at no runtime cost.

§Choosing the value type

T is ?Sized, so a rule can target an unsized type such as str or [u8] and be reused for the owned forms by being generic over a borrow. The NonEmpty rule below works for str, String, and &str alike because it is written over S: AsRef<str>:

use type_lib::{ValidationError, Validator};

struct NonEmpty;

impl<S: AsRef<str> + ?Sized> Validator<S> for NonEmpty {
    type Error = ValidationError;

    fn validate(value: &S) -> Result<(), Self::Error> {
        if value.as_ref().is_empty() {
            Err(ValidationError::new("non_empty", "value must not be empty"))
        } else {
            Ok(())
        }
    }
}

assert!(NonEmpty::validate("hello").is_ok());
assert!(NonEmpty::validate("").is_err());

§Custom error types

Error is an associated type, so a rule can report a rich, structured failure instead of the bundled ValidationError:

use type_lib::Validator;

#[derive(Debug, PartialEq)]
struct TooLong {
    limit: usize,
    actual: usize,
}

struct MaxLen8;

impl Validator<str> for MaxLen8 {
    type Error = TooLong;

    fn validate(value: &str) -> Result<(), Self::Error> {
        let actual = value.chars().count();
        if actual > 8 {
            Err(TooLong { limit: 8, actual })
        } else {
            Ok(())
        }
    }
}

assert_eq!(
    MaxLen8::validate("far-too-long"),
    Err(TooLong { limit: 8, actual: 12 }),
);

Required Associated Types§

Source

type Error

The failure produced when a value violates the rule.

Use ValidationError for simple cases, or a bespoke type when callers need to inspect structured details of the failure.

Required Methods§

Source

fn validate(value: &T) -> Result<(), Self::Error>

Checks value against the rule.

Returns Ok(()) when the value satisfies the invariant, or Err(Self::Error) describing why it does not. This is a pure predicate: it never mutates or transforms the value.

§Errors

Returns Self::Error when value fails the rule.

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety".

Implementors§

Source§

impl Validator<f32> for Negative

Source§

impl Validator<f32> for NonNegative

Source§

impl Validator<f32> for NonPositive

Source§

impl Validator<f32> for Positive

Source§

impl Validator<f64> for Negative

Source§

impl Validator<f64> for NonNegative

Source§

impl Validator<f64> for NonPositive

Source§

impl Validator<f64> for Positive

Source§

impl Validator<i8> for Negative

Source§

impl Validator<i8> for NonNegative

Source§

impl Validator<i8> for NonPositive

Source§

impl Validator<i8> for Positive

Source§

impl Validator<i16> for Negative

Source§

impl Validator<i16> for NonNegative

Source§

impl Validator<i16> for NonPositive

Source§

impl Validator<i16> for Positive

Source§

impl Validator<i32> for Negative

Source§

impl Validator<i32> for NonNegative

Source§

impl Validator<i32> for NonPositive

Source§

impl Validator<i32> for Positive

Source§

impl Validator<i64> for Negative

Source§

impl Validator<i64> for NonNegative

Source§

impl Validator<i64> for NonPositive

Source§

impl Validator<i64> for Positive

Source§

impl Validator<i128> for Negative

Source§

impl Validator<i128> for NonNegative

Source§

impl Validator<i128> for NonPositive

Source§

impl Validator<i128> for Positive

Source§

impl Validator<isize> for Negative

Source§

impl Validator<isize> for NonNegative

Source§

impl Validator<isize> for NonPositive

Source§

impl Validator<isize> for Positive

Source§

impl<S: AsRef<str> + ?Sized> Validator<S> for Alphanumeric

Source§

impl<S: AsRef<str> + ?Sized> Validator<S> for Ascii

Source§

impl<S: AsRef<str> + ?Sized> Validator<S> for Trimmed

Source§

impl<T, A> Validator<T> for Not<A>
where T: ?Sized, A: Validator<T>,

Source§

impl<T, A, B, E> Validator<T> for And<A, B>
where T: ?Sized, A: Validator<T, Error = E>, B: Validator<T, Error = E>,

Source§

type Error = E

Source§

impl<T, A, B, E> Validator<T> for Or<A, B>
where T: ?Sized, A: Validator<T, Error = E>, B: Validator<T, Error = E>,

Source§

type Error = E

Source§

impl<T: HasLength + ?Sized> Validator<T> for NonEmpty

Source§

impl<const MAX: usize, T: HasLength + ?Sized> Validator<T> for MaxLen<MAX>

Source§

impl<const MIN: i64, const MAX: i64> Validator<i8> for InRange<MIN, MAX>

Source§

impl<const MIN: i64, const MAX: i64> Validator<i16> for InRange<MIN, MAX>

Source§

impl<const MIN: i64, const MAX: i64> Validator<i32> for InRange<MIN, MAX>

Source§

impl<const MIN: i64, const MAX: i64> Validator<i64> for InRange<MIN, MAX>

Source§

impl<const MIN: i64, const MAX: i64> Validator<u8> for InRange<MIN, MAX>

Source§

impl<const MIN: i64, const MAX: i64> Validator<u16> for InRange<MIN, MAX>

Source§

impl<const MIN: i64, const MAX: i64> Validator<u32> for InRange<MIN, MAX>

Source§

impl<const MIN: usize, T: HasLength + ?Sized> Validator<T> for MinLen<MIN>

Source§

impl<const MIN: usize, const MAX: usize, T: HasLength + ?Sized> Validator<T> for LenRange<MIN, MAX>