Skip to content

Commit 95a4404

Browse files
committed
add email validation
1 parent 7ab90c1 commit 95a4404

2 files changed

Lines changed: 71 additions & 0 deletions

File tree

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package it.aboutbits.springboot.testing.validation.rule;
2+
3+
import com.google.errorprone.annotations.CheckReturnValue;
4+
import it.aboutbits.springboot.testing.validation.core.BaseRuleBuilder;
5+
import it.aboutbits.springboot.testing.validation.core.Rule;
6+
import it.aboutbits.springboot.testing.validation.core.ValidationRulesData;
7+
import it.aboutbits.springboot.testing.validation.source.InvalidEmailValueSource;
8+
import org.jspecify.annotations.NullMarked;
9+
10+
@SuppressWarnings("unchecked")
11+
@NullMarked
12+
public interface EmailRule<V extends BaseRuleBuilder<?>> extends ValidationRulesData {
13+
/**
14+
* Bean validation considers `null` and blank values to be valid e-mail addresses.
15+
* Combine this rule with `notNull` or `notBlank` if the property must be present.
16+
*/
17+
@CheckReturnValue
18+
default V email(String property) {
19+
addRule(
20+
new Rule(property, InvalidEmailValueSource.class)
21+
);
22+
return (V) this;
23+
}
24+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package it.aboutbits.springboot.testing.validation.source;
2+
3+
import it.aboutbits.springboot.testing.validation.core.ValueSource;
4+
import org.jspecify.annotations.NullMarked;
5+
import org.jspecify.annotations.Nullable;
6+
7+
import java.util.HashMap;
8+
import java.util.Map;
9+
import java.util.function.Function;
10+
import java.util.stream.Stream;
11+
12+
@NullMarked
13+
public class InvalidEmailValueSource implements ValueSource {
14+
private static final Map<Class<?>, Function<Object[], Stream<?>>> TYPE_SOURCES = new HashMap<>();
15+
16+
static {
17+
TYPE_SOURCES.put(
18+
String.class,
19+
(Object[] args) -> Stream.of(
20+
"plainaddress",
21+
"@example.com",
22+
"someone@",
23+
"someone@@example.com",
24+
"some one@example.com",
25+
"someone@exam ple.com",
26+
"someone@example..com",
27+
"someone@.example.com"
28+
)
29+
);
30+
}
31+
32+
@SuppressWarnings("unused")
33+
public static void registerType(Class<?> type, Function<Object[], Stream<?>> source) {
34+
TYPE_SOURCES.put(type, source);
35+
}
36+
37+
@Override
38+
@SuppressWarnings("unchecked")
39+
public <T> Stream<@Nullable T> values(Class<T> propertyClass, Object... args) {
40+
var sourceFunction = TYPE_SOURCES.get(propertyClass);
41+
if (sourceFunction != null) {
42+
return (Stream<@Nullable T>) sourceFunction.apply(args);
43+
}
44+
45+
throw new IllegalArgumentException("Property class not supported!");
46+
}
47+
}

0 commit comments

Comments
 (0)