package sample.util;
import java.util.function.Consumer;
import sample.*;
import sample.ValidationException.Warns;
/**
* 審査例外の構築概念を表現します。
*/
public class Validator {
private Warns warns = Warns.init();
/** 審査処理を行います。 */
public static void validate(Consumer<Validator> proc) {
Validator validator = new Validator();
proc.accept(validator);
validator.verify();
}
/** 審査を行います。validがfalseの時に例外を内部にスタックします。 */
public Validator check(boolean valid, String message) {
if (!valid)
warns.add(message);
return this;
}
/** 個別属性の審査を行います。validがfalseの時に例外を内部にスタックします。 */
public Validator checkField(boolean valid, String field, String message) {
if (!valid)
warns.add(field, message);
return this;
}
/** 審査を行います。失敗した時は即時に例外を発生させます。 */
public Validator verify(boolean valid, String message) {
return check(valid, message).verify();
}
/** 個別属性の審査を行います。失敗した時は即時に例外を発生させます。 */
public Validator verifyField(boolean valid, String field, String message) {
return checkField(valid, field, message).verify();
}
/** 検証します。事前に行ったcheckで例外が存在していた時は例外を発生させます。 */
public Validator verify() {
if (hasWarn())
throw new ValidationException(warns);
return clear();
}
/** 審査例外を保有している時はtrueを返します。 */
public boolean hasWarn() {
return warns.nonEmpty();
}
/** 内部に保有する審査例外を初期化します。 */
public Validator clear() {
warns.list().clear();
return this;
}
}