valitron 0.5.6

Valitron is an ergonomics, functional and configurable validator
Documentation
use valitron::{
    available::{Email, Message, Required, Trim},
    register::string::Validator,
    rule::string::{custom, StringRuleExt},
};

pub fn main() {
    let data = Input {
        name: " Jone ".into(),
        email: "jone@gmail.com".into(),
        gender: "male".into(),
        password: "Abc123".into(),
        age: 12,
        weight: 101.2,
    };

    let data = Input::new(data).unwrap();

    assert_eq!(data.name, "Jone");
}

struct Input {
    name: String,
    email: String,
    gender: String,
    password: String,
    age: u8,
    weight: f32,
}

impl Input {
    fn new(mut input: Input) -> Result<Self, Validator<Message>> {
        let valid = Validator::new()
            .insert("name", &mut input.name, Trim.and(Required))
            .insert("email", &mut input.email, Trim.and(Required).and(Email))
            .insert("gender", &mut input.gender, custom(validate_gender))
            .insert(
                "password",
                &mut input.password,
                Trim.custom(validate_password),
            )
            .insert_fn("age", || {
                if input.age < 10 {
                    input.age = 10;
                }
                if input.age > 18 {
                    Err(Message::fallback("age is out of range"))
                } else {
                    Ok(())
                }
            });

        valid.validate(input)
    }
}

fn validate_password(pass: &mut String) -> Result<(), Message> {
    let upper = pass.find(char::is_uppercase);
    let lower = pass.find(char::is_lowercase);
    let num = pass.find(char::is_numeric);
    if upper.is_some() && lower.is_some() && num.is_some() {
        Ok(())
    } else {
        Err(Message::fallback(
            "password need to contain uppercase, lowercase and numeric",
        ))
    }
}

fn validate_gender(gender: &mut String) -> Result<(), Message> {
    Ok(())
}