Skip to content

Commit 3a05a9e

Browse files
committed
feat: added EmailAdresse parse
1 parent aee48d0 commit 3a05a9e

File tree

2 files changed

+60
-1
lines changed

2 files changed

+60
-1
lines changed
Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,52 @@
11
package io.rocketbase.mail.dto;
22

3+
import lombok.EqualsAndHashCode;
34
import lombok.Getter;
45
import lombok.RequiredArgsConstructor;
6+
import lombok.ToString;
57
import org.springframework.util.StringUtils;
68

9+
import java.util.regex.Matcher;
10+
import java.util.regex.Pattern;
11+
12+
@EqualsAndHashCode(of = {"email", "name"})
713
@Getter
814
@RequiredArgsConstructor
915
public class EmailAddress {
1016

1117
private final String email;
12-
1318
private final String name;
1419

20+
private static final Pattern NAME_EMAIL_PATTERN = Pattern.compile("\"([^\"]*)\"\\s*<([^>]*)>");
21+
private static final Pattern EMAIL_PATTERN = Pattern.compile("<([^>]*)>");
22+
1523
public EmailAddress(String email) {
1624
this.email = email;
1725
this.name = null;
1826
}
1927

28+
public static EmailAddress parse(String email) {
29+
Matcher emailNameMatcher = NAME_EMAIL_PATTERN.matcher(email);
30+
if (emailNameMatcher.matches()) {
31+
return new EmailAddress(emailNameMatcher.group(2),emailNameMatcher.group(1) );
32+
}
33+
Matcher emailMatcher = EMAIL_PATTERN.matcher(email);
34+
if (emailMatcher.matches()) {
35+
return new EmailAddress(emailMatcher.group(1) );
36+
}
37+
throw new IllegalArgumentException("Invalid email address: " + email);
38+
}
39+
2040
public String toRecipient() {
2141
if (!StringUtils.isEmpty(name)) {
2242
return "\"%s\" <%s>".formatted(name, email);
2343
} else {
2444
return "<%s>".formatted(email);
2545
}
2646
}
47+
48+
@Override
49+
public String toString() {
50+
return toRecipient();
51+
}
2752
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package io.rocketbase.mail.dto;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import static org.hamcrest.MatcherAssert.assertThat;
6+
import static org.hamcrest.Matchers.*;
7+
import static org.junit.jupiter.api.Assertions.*;
8+
9+
class EmailAddressTest {
10+
11+
@Test
12+
void parseSimple() {
13+
EmailAddress email = EmailAddress.parse("<marten@rocketbase.io>");
14+
assertThat(email, equalTo(new EmailAddress("marten@rocketbase.io")));
15+
}
16+
17+
@Test
18+
void parseCombined() {
19+
EmailAddress whiteSpace = EmailAddress.parse("\"Marten Prieß\" <marten@rocketbase.io>");
20+
EmailAddress without = EmailAddress.parse("\"Marten Prieß\"<marten@rocketbase.io>");
21+
EmailAddress compared = new EmailAddress("marten@rocketbase.io", "Marten Prieß");
22+
assertThat(whiteSpace, equalTo(compared));
23+
assertThat(without, equalTo(compared));
24+
}
25+
26+
@Test()
27+
void checkFailure() {
28+
try {
29+
EmailAddress error = EmailAddress.parse("\"Marten Prieß\" <marten@rocketbase.io");
30+
} catch (Exception e) {
31+
assertThat(e, instanceOf(IllegalArgumentException.class));
32+
}
33+
}
34+
}

0 commit comments

Comments
 (0)