package com.googlecode.totallylazy.validations; import com.googlecode.totallylazy.functions.Function1; import com.googlecode.totallylazy.Callers; import com.googlecode.totallylazy.functions.Functions; import com.googlecode.totallylazy.Pair; import com.googlecode.totallylazy.Sequence; import com.googlecode.totallylazy.functions.Unary; import static com.googlecode.totallylazy.functions.Functions.returns1; import static com.googlecode.totallylazy.Pair.pair; import static com.googlecode.totallylazy.validations.ValidationResult.constructors.pass; import static com.googlecode.totallylazy.validations.ValidationResult.functions.add; public class SetFailureMessage<T> extends LogicalValidator<T> { private final Validator<? super T> decorated; private final Function1<? super T, String> message; public SetFailureMessage(Validator<? super T> decorated, Function1<? super T, String> message) { this.decorated = decorated; this.message = message; } @Override public ValidationResult validate(T instance) { Sequence<Pair<String, Sequence<String>>> messages = decorated.validate(instance).messages(); return messages. map(overrideMessages(instance, message)). fold(pass(), add()); } private static <T> Unary<Pair<String, Sequence<String>>> overrideMessages(final T instance, final Function1<T, String> messageBuilder) { return keyAndMessages -> { String message1 = Callers.call(messageBuilder, instance); return pair(keyAndMessages.first(), keyAndMessages.second().map(returns1(message1))); }; } public static class constructors{ public static <T> SetFailureMessage<T> setFailureMessage(Validator<? super T> decorated, String message){ return setFailureMessage(decorated, Functions.<T, String>returns1(message)); } public static <T> SetFailureMessage<T> setFailureMessage(Validator<? super T> decorated, Function1<? super T, String> message){ return new SetFailureMessage<T>(decorated,message); } } }