domainstack-derive 1.1.1

Derive macros for domainstack: #[derive(Validate, ToSchema, ToJsonSchema)] - validation + auto-generate OpenAPI/JSON Schema
Documentation
use domainstack::prelude::*;
use domainstack_derive::Validate;

#[allow(clippy::result_large_err)]
fn validate_even(value: &u8) -> Result<(), ValidationError> {
    if *value % 2 == 0 {
        Ok(())
    } else {
        Err(ValidationError::single(
            Path::root(),
            "not_even",
            "Must be even",
        ))
    }
}

#[derive(Debug, Validate)]
struct EvenNumber {
    #[validate(range(min = 0, max = 100))]
    #[validate(custom = "validate_even")]
    value: u8,
}

#[test]
fn test_custom_validation_pass() {
    let num = EvenNumber { value: 42 };
    assert!(num.validate().is_ok());
}

#[test]
fn test_custom_validation_fail() {
    let num = EvenNumber { value: 43 };

    let result = num.validate();
    assert!(result.is_err());

    let err = result.unwrap_err();
    assert_eq!(err.violations.len(), 1);
    assert_eq!(err.violations[0].path.to_string(), "value");
    assert_eq!(err.violations[0].code, "not_even");
}

#[test]
fn test_custom_with_range_fail() {
    let num = EvenNumber { value: 200 };

    let result = num.validate();
    assert!(result.is_err());

    let err = result.unwrap_err();
    assert_eq!(err.violations.len(), 1);
    assert_eq!(err.violations[0].code, "out_of_range");
}

#[test]
fn test_both_validations_fail() {
    let num = EvenNumber { value: 101 };

    let result = num.validate();
    assert!(result.is_err());

    let err = result.unwrap_err();
    assert_eq!(err.violations.len(), 2);

    assert_eq!(err.violations[0].code, "out_of_range");
    assert_eq!(err.violations[1].code, "not_even");
}