endors 0.1.0

Validation library
Documentation
use endors::{
    collect_results, validate,
    validators::{Len, LessThan, NotEqual},
    Validator,
};

struct DummyModel {
    a: String,
    b: i32,
    c: bool,
}

impl DummyModel {
    fn calculated(&self) -> i32 {
        self.b + self.c as i32
    }
}

struct DummyValidator;
impl Validator<&DummyModel> for DummyValidator {
    fn validate(&self, value: &DummyModel) -> Result<(), endors::Error> {
        collect_results!(
            validate!(value.a, Len { min: 1, max: 100 }),
            validate!(value.a, |a: &String| a.starts_with("abc") => "a must start with abc"),
            validate!(value.b, LessThan(5)),
            validate!(value.c, NotEqual(true)),
            validate!(value.calculated(), NotEqual(6)),
        )
    }
}

#[test]
fn no_failures_when_valid_model() {
    let val = DummyModel {
        a: "abc".to_string(),
        b: 4,
        c: false,
    };
    let result = DummyValidator.validate(&val);
    assert!(result.is_ok())
}

#[test]
fn two_failures_when_a_is_empty() {
    let val = DummyModel {
        a: "".to_string(),
        b: 4,
        c: false,
    };
    let result = DummyValidator.validate(&val);
    assert!(result.is_err());
    assert_eq!(2, result.unwrap_err().failures().len())
}

#[test]
fn single_failure_when_a_does_not_start_with_abc() {
    let val = DummyModel {
        a: "test".to_string(),
        b: 4,
        c: false,
    };
    let result = DummyValidator.validate(&val);
    assert!(result.is_err());
    assert_eq!(1, result.unwrap_err().failures().len())
}

#[test]
fn single_failure_when_b_greater_than_four() {
    let val = DummyModel {
        a: "abc".to_string(),
        b: 5,
        c: false,
    };
    let result = DummyValidator.validate(&val);
    assert!(result.is_err());
    assert_eq!(1, result.unwrap_err().failures().len())
}

#[test]
fn single_failure_when_c_equal_to_true() {
    let val = DummyModel {
        a: "abc".to_string(),
        b: 4,
        c: true,
    };
    let result = DummyValidator.validate(&val);
    assert!(result.is_err());
    assert_eq!(1, result.unwrap_err().failures().len())
}

#[test]
fn four_failures_when_all_fields_invalid() {
    let val = DummyModel {
        a: "".to_string(),
        b: 5,
        c: true,
    };
    let result = DummyValidator.validate(&val);
    assert!(result.is_err());
    assert_eq!(5, result.unwrap_err().failures().len())
}