Skip to content

Instantly share code, notes, and snippets.

scala> EmailAddress("@example.com")
res0: Either[String,EmailAddress] = Left(Invalid email address)
def apply(emailAddress: String): Either[String, EmailAddress] = {
if (isValidAddress(emailAddress)) {
Right(new EmailAddress(emailAddress))
} else {
Left("Invalid email address")
}
}
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
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 = {
scala> EmailAddress("@example.com")
res0: EmailAddress = EmailAddress(@example.com)
scala> EmailClient.sendEmail(from = EmailAddress("luis@example.com"), to = EmailAddress("carlos@example.com"))(
"""
Hello,
Hope you're doing well!
Best,
Luis
"""
)
val shoppingCart: List[Fruit] = List(
Orange(0.25),
Orange(0.33),
Apple(0.22),
Apple(0.27),
Apple(0.30)
)
orderTotal(shoppingCart) // 4.69
val shoppingCart: List[Item] = List(
Orange(0.25),
Orange(0.33),
Apple(0.22),
Apple(0.27),
Apple(0.30),
Baguette(2),
ToothPaste(4)
)
def orderTotal(shoppingCart: List[Item]): Double = {
import PriceCompanion._
shoppingCart.foldLeft(0.0) { case (total, item) =>
total + implicitly[Price[Item]].price(item)
}
}