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
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") | |
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
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") | |
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
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
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
val shoppingCart: List[Fruit] = List( | |
Orange(0.25), | |
Orange(0.33), | |
Apple(0.22), | |
Apple(0.27), | |
Apple(0.30) | |
) | |
orderTotal(shoppingCart) // 4.69 |
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
val shoppingCart: List[Item] = List( | |
Orange(0.25), | |
Orange(0.33), | |
Apple(0.22), | |
Apple(0.27), | |
Apple(0.30), | |
Baguette(2), | |
ToothPaste(4) | |
) |
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 orderTotal(shoppingCart: List[Item]): Double = { | |
import PriceCompanion._ | |
shoppingCart.foldLeft(0.0) { case (total, item) => | |
total + implicitly[Price[Item]].price(item) | |
} | |
} |