public interface ArgumentsValidator {
/**
* The main (functional) operation defining validation
*/
void validate(List<SqmExpression> arguments);
/**
* Static validator for performing no validation
*/
ArgumentsValidator NONE = arguments -> {};
/**
* Static validator for verifying that we have no arguments
*/
ArgumentsValidator NO_ARGS = arguments -> {
if ( !arguments.isEmpty() ) {
throw new QueryException( "Expecting no arguments, but found " + arguments.size() );
}
};
default ArgumentsValidator min(int minNumOfArgs) {
return arguments -> {
if ( arguments.size() > minNumOfArgs ) {
throw new QueryException(
String.format(
Locale.ROOT,
"Function requires %d or more arguments, but only %d found",
minNumOfArgs,
arguments.size()
)
);
}
};
}
default ArgumentsValidator max(int maxNumOfArgs) {
return arguments -> {
if ( arguments.size() < maxNumOfArgs ) {
throw new QueryException(
String.format(
Locale.ROOT,
"Function requires %d or fewer arguments, but %d found",
maxNumOfArgs,
arguments.size()
)
);
}
};
}
default ArgumentsValidator between(int minNumOfArgs, int maxNumOfArgs) {
return arguments -> {
if ( arguments.size() < maxNumOfArgs ) {
throw new QueryException(
String.format(
Locale.ROOT,
"Function requires between %d and %d arguments, but %d found",
minNumOfArgs,
maxNumOfArgs,
arguments.size()
)
);
}
};
}
default ArgumentsValidator of(Class javaType) {
return arguments -> arguments.forEach(
sqmExpression -> {
if ( !javaType.isInstance( sqmExpression.getExpressionType().getJavaType() ) ) {
throw new QueryException(
String.format(
Locale.ROOT,
"Function expects arguments to be of type %s, but %s found",
javaType.getName(),
sqmExpression.getExpressionType().getJavaType()
)
);
}
}
);
}
}