validator_struct 0.3.1

A simple ergonomic addition to the validator crate
Documentation
mod tests {
    use serde::{Deserialize, Serialize};
    use validator::{Validate, ValidationError};
    use validator_struct::ValidatorStruct;

    #[derive(Validate, ValidatorStruct)]
    #[validator_struct(derive(Serialize))]
    struct Foo {
        #[validate(length(equal = 5, message = "Please provide a valid foo!"))]
        foo: String,
        bar: String,
    }

    #[test]
    fn test_message() {
        let bad_foo = Foo {
            foo: "hi!".into(),
            bar: "there".into(),
        };

        let err = bad_foo.validate_struct().unwrap_err().foo;
        assert_eq!(err, Some(vec!["Please provide a valid foo!".to_string()]));

        let err = bad_foo.validate().unwrap_err().to_string();
        assert_eq!(err, "foo: Please provide a valid foo!");
    }

    fn validate_username(username: &str) -> Result<(), ValidationError> {
        if username.len() < 2 {
            return Err(ValidationError::new("Username is too short"));
        };

        Ok(())
    }

    #[derive(Deserialize, Validate, ValidatorStruct)]
    #[validator_struct(derive(Serialize))]
    struct BasicSignupForm {
        #[validate(custom(function = "validate_username"))]
        username: String,
    }

    #[test]
    fn test_custom_validator() {
        let bad_form = BasicSignupForm {
            username: "a".to_string(),
        };

        let err = bad_form.validate_struct().unwrap_err().username;
        assert_eq!(err, Some(vec!["Username is too short".to_string()]));
    }
}