This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
case class EmailAddress(emailAddress: String) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
scala> EmailClient.sendEmail(from = EmailAddress("[email protected]"), to = EmailAddress("[email protected]"))( | |
""" | |
Hello, | |
Hope you're doing well! | |
Best, | |
Luis | |
""" | |
) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
scala> EmailAddress("@example.com") | |
res0: EmailAddress = EmailAddress(@example.com) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
object EmailAddress { | |
// Regex that captures the "official" format standard (RFC 5322) that email addresses must adhere to | |
private val EmailRegex = """(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])""".r | |
private def isValidAddress(emailAddress: String): Boolean = { | |
EmailRegex.findAllMatchIn(emailAddress).length == 1 | |
} | |
def apply(emailAddress: String): EmailAddress = { |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
scala> EmailAddress("@example.com") | |
java.lang.IllegalArgumentException: requirement failed: Invalid email address | |
at scala.Predef$.require(Predef.scala:277) | |
at EmailAddress$.apply(<pastie>:23) | |
... 36 elided |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def apply(emailAddress: String): Either[String, EmailAddress] = { | |
if (isValidAddress(emailAddress)) { | |
Right(new EmailAddress(emailAddress)) | |
} else { | |
Left("Invalid email address") | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
scala> EmailAddress("@example.com") | |
res0: Either[String,EmailAddress] = Left(Invalid email address) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
scala> val emailAddress = EmailAddress("[email protected]") | |
emailAddress: Either[String,EmailAddress] = Right(EmailAddress([email protected])) | |
scala> emailAddress.map(_.copy(emailAddress = "@example.com")) | |
res0: scala.util.Either[String,EmailAddress] = Right(EmailAddress(@example.com)) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
case class EmailAddress(emailAddress: String) { | |
def copy(emailAddress: String = emailAddress): Either[String, EmailAddress] = { | |
EmailAddress(emailAddress) | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
scala> EmailAddress("[email protected]").map(_.copy(emailAddress = "@example.com")) | |
res0: scala.util.Either[String,Either[String,EmailAddress]] = Right(Left(Invalid email address)) | |
scala> for { | |
| e1 <- EmailAddress("[email protected]") | |
| e2 <- e1.copy(emailAddress = "@example.com") | |
| } yield e2 | |
res1: scala.util.Either[String,EmailAddress] = Left(Invalid email address) |