Skip to content

Commit 2f363d4

Browse files
committed
feat: Validate string format 'email'
1 parent 4f5b234 commit 2f363d4

2 files changed

Lines changed: 16 additions & 1 deletion

File tree

src/main/java/com/retailsvc/http/validate/DefaultValidator.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,14 @@ public final class DefaultValidator implements Validator {
4343

4444
private record FormatCheck(Predicate<String> isValid, String message) {}
4545

46+
private static final Pattern EMAIL = Pattern.compile("^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$");
47+
4648
private static final Map<String, FormatCheck> FORMAT_CHECKS =
4749
Map.of(
4850
"uuid", new FormatCheck(DefaultValidator::isUuid, "not a valid uuid"),
4951
"date", new FormatCheck(DefaultValidator::isDate, "not a valid date"),
50-
"date-time", new FormatCheck(DefaultValidator::isDateTime, "not a valid date-time"));
52+
"date-time", new FormatCheck(DefaultValidator::isDateTime, "not a valid date-time"),
53+
"email", new FormatCheck(s -> EMAIL.matcher(s).matches(), "not a valid email"));
5154

5255
private final Function<String, Schema> refResolver;
5356
private final ConcurrentMap<String, Pattern> compiledPatterns = new ConcurrentHashMap<>();

src/test/java/com/retailsvc/http/validate/StringIntegerNumberTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,18 @@ void stringFormatUuid() {
6767
.isEqualTo("format");
6868
}
6969

70+
@Test
71+
void stringFormatEmail() {
72+
StringSchema s = new StringSchema(Set.of(TypeName.STRING), null, null, null, "email", null);
73+
assertThatCode(() -> v.validate("user@example.com", s, "/v")).doesNotThrowAnyException();
74+
assertThatThrownBy(() -> v.validate("not-an-email", s, "/v"))
75+
.extracting(t -> ((ValidationException) t).error().keyword())
76+
.isEqualTo("format");
77+
assertThatThrownBy(() -> v.validate("missing@dot", s, "/v"))
78+
.extracting(t -> ((ValidationException) t).error().keyword())
79+
.isEqualTo("format");
80+
}
81+
7082
@Test
7183
void integerWithMinMax() {
7284
IntegerSchema s =

0 commit comments

Comments
 (0)