Skip to content

Commit e503972

Browse files
committed
Use MinAdapter with switch on _type + separate adapters for BigDecimal and BigInteger
1 parent a8fd507 commit e503972

File tree

1 file changed

+48
-10
lines changed

1 file changed

+48
-10
lines changed

validator/src/main/java/io/avaje/validation/core/adapters/NumberAdapters.java

Lines changed: 48 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ private NumberAdapters() {}
2424
case "Negative" -> new NegativeAdapter(request, false);
2525
case "NegativeOrZero" -> new NegativeAdapter(request, true);
2626
case "Max" -> forMax(request);
27-
case "Min" -> new MinAdapter(request);
27+
case "Min" -> forMin(request);
2828
case "DecimalMax" -> new DecimalMaxAdapter(request);
2929
case "DecimalMin" -> new DecimalMinAdapter(request);
3030
case "Range" -> new RangeAdapter(request);
@@ -41,13 +41,12 @@ private static AbstractConstraintAdapter<? extends Number> forMax(AdapterCreateR
4141
}
4242

4343
private static AbstractConstraintAdapter<? extends Number> forMin(AdapterCreateRequest request) {
44-
// final String targetType = request.targetType();
45-
// return switch (targetType) {
46-
// case "BigDecimal" -> new MinBigDecimal(request);
47-
// case "BigInteger" -> new MinBigInteger(request);
48-
// default -> new MinAdapter(request);
49-
// };
50-
return new MinAdapter(request);
44+
final String targetType = request.targetType();
45+
return switch (targetType) {
46+
case "BigDecimal" -> new MinBigDecimal(request);
47+
case "BigInteger" -> new MinBigInteger(request);
48+
default -> new MinAdapter(request);
49+
};
5150
}
5251

5352

@@ -162,16 +161,55 @@ public boolean isValid(BigInteger number) {
162161
private static final class MinAdapter extends AbstractConstraintAdapter<Number> implements NumberAdapter<Number> {
163162

164163
private final long value;
164+
private final String targetType;
165165

166166
MinAdapter(AdapterCreateRequest request) {
167167
super(request);
168+
this.targetType = request.targetType();
168169
this.value = (long) request.attribute("value");
169170
}
170171

171172
@Override
172173
public boolean isValid(Number number) {
173-
// null values are valid
174-
return number == null || NumberComparatorHelper.compare(number, value, LESS_THAN) >= 0;
174+
if (number == null) {
175+
return true;
176+
}
177+
return switch (targetType) {
178+
case "Integer", "Long", "Short", "Byte" -> number.longValue() >= value;
179+
case "Double" -> compareDouble(number.doubleValue(), value, LESS_THAN) >= 0;
180+
case "Float" -> compareFloat((Float)number, value, LESS_THAN) >= 0;
181+
default -> throw new IllegalStateException();
182+
};
183+
}
184+
}
185+
186+
static final class MinBigDecimal extends AbstractConstraintAdapter<BigDecimal> implements NumberAdapter<BigDecimal> {
187+
188+
private final BigDecimal min;
189+
190+
MinBigDecimal(AdapterCreateRequest request) {
191+
super(request);
192+
this.min = new BigDecimal(String.valueOf(request.attribute("value")));
193+
}
194+
195+
@Override
196+
public boolean isValid(BigDecimal number) {
197+
return number == null || number.compareTo(min) >= 0;
198+
}
199+
}
200+
201+
static final class MinBigInteger extends AbstractConstraintAdapter<BigInteger> implements NumberAdapter<BigInteger> {
202+
203+
private final BigInteger min;
204+
205+
MinBigInteger(AdapterCreateRequest request) {
206+
super(request);
207+
this.min = new BigInteger(String.valueOf(request.attribute("value")));
208+
}
209+
210+
@Override
211+
public boolean isValid(BigInteger number) {
212+
return number == null || number.compareTo(min) >= 0;
175213
}
176214
}
177215

0 commit comments

Comments
 (0)