package com.googlecode.totallylazy.validations;
import com.googlecode.totallylazy.functions.Function1;
import com.googlecode.totallylazy.predicates.Predicate;
import com.googlecode.totallylazy.functions.CurriedCombiner;
import static com.googlecode.totallylazy.validations.PredicateValidator.constructors.validatePredicate;
import static com.googlecode.totallylazy.validations.ValidationResult.constructors.pass;
public interface Validator<T> extends Predicate<T> {
ValidationResult validate(T instance);
class functions {
public static <T> Function1<Validator<? super T>, ValidationResult> validateAgainst(final T value) {
return validator -> validator.validate(value);
}
public static <T> CurriedCombiner<T, ValidationResult> validateWith(final Validator<? super T> validator) {
return new CurriedCombiner<T, ValidationResult>() {
@Override
public ValidationResult call(ValidationResult validationResult, T instance) throws Exception {
return validationResult.merge(validator.validate(instance));
}
@Override
public ValidationResult identity() {
return pass();
}
@Override
public ValidationResult combine(ValidationResult a, ValidationResult b) throws Exception {
return a.merge(b);
}
};
}
public static <T> Function1<Validator<T>, Validator<T>> setFailureMessage(final String message) {
return validator -> validatePredicate(validator, message);
}
public static <T> Function1<Validator<T>, Validator<T>> setFailureMessage(final Function1<T, String> message) {
return validator -> validatePredicate(validator, message);
}
}
}