valitron 0.5.6

Valitron is an ergonomics, functional and configurable validator
Documentation
use serde::Serialize;
use valitron::{
    available::{Message, Required, StartWith, Trim},
    Rule, RuleExt, Validator, Value,
};

#[derive(Debug, Serialize)]
struct Input {
    name: String,
    num: u8,
}

fn main() {
    let validator = Validator::new()
        .rule("name", Trim.and(Required).and(StartWith("foo")))
        .map(MyMessage::from)
        .rule("num", Gt10)
        .message([
            ("name.required", MyMessage::NameRequierd),
            ("name.start_with", MyMessage::NameStartWith),
            ("num.gt10", MyMessage::Gt10),
        ]);

    let input = Input {
        name: "bar".into(),
        num: 9,
    };
    let res = validator.validate(&input).unwrap_err();

    assert_eq!(res.get("name").unwrap()[0], MyMessage::NameStartWith);
    assert_eq!(res.get("num").unwrap()[0], MyMessage::Gt10);
}

#[derive(Debug, Eq, PartialEq)]
enum MyMessage {
    NameRequierd,
    NameStartWith,
    Gt10,
    NotReset,
}

impl From<Message> for MyMessage {
    fn from(_value: Message) -> Self {
        Self::NotReset
    }
}

#[derive(Clone)]
struct Gt10;

impl Rule for Gt10 {
    type Message = MyMessage;

    const NAME: &'static str = "gt10";

    fn message(&self) -> Self::Message {
        MyMessage::Gt10
    }

    fn call(&mut self, data: &mut Value) -> bool {
        data > 10_u8
    }
}