aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/xyz/driver/core/domain.scala
diff options
context:
space:
mode:
authorSergey Nastich <nastich@users.noreply.github.com>2018-09-20 13:43:28 -0400
committerGitHub <noreply@github.com>2018-09-20 13:43:28 -0400
commit388d631b75acec04440b8f285fd98d89bbd898db (patch)
treefddc1886d76c74956b26010e8b20c7670f475b7a /src/main/scala/xyz/driver/core/domain.scala
parent3eb6a9e96bd8bf111490f390ea94a1c6d7677eff (diff)
downloaddriver-core-388d631b75acec04440b8f285fd98d89bbd898db.tar.gz
driver-core-388d631b75acec04440b8f285fd98d89bbd898db.tar.bz2
driver-core-388d631b75acec04440b8f285fd98d89bbd898db.zip
DFC-775 Improve PhoneNumber (backport from master without TN extensions) (#223)v1.14.4
Diffstat (limited to 'src/main/scala/xyz/driver/core/domain.scala')
-rw-r--r--src/main/scala/xyz/driver/core/domain.scala38
1 files changed, 33 insertions, 5 deletions
diff --git a/src/main/scala/xyz/driver/core/domain.scala b/src/main/scala/xyz/driver/core/domain.scala
index 59bed54..459c804 100644
--- a/src/main/scala/xyz/driver/core/domain.scala
+++ b/src/main/scala/xyz/driver/core/domain.scala
@@ -1,13 +1,20 @@
package xyz.driver.core
import com.google.i18n.phonenumbers.PhoneNumberUtil
+import com.google.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat
import scalaz.Equal
import scalaz.std.string._
import scalaz.syntax.equal._
+import scala.util.Try
+import scala.util.control.NonFatal
+
object domain {
final case class Email(username: String, domain: String) {
+
+ val value: String = toString
+
override def toString: String = username + "@" + domain
}
@@ -23,18 +30,39 @@ object domain {
}
}
- final case class PhoneNumber(countryCode: String = "1", number: String) {
+ final case class PhoneNumber(countryCode: String, number: String) {
+
+ /** This is a more human-friendly alias for #toE164String() */
+ def toCompactString: String = s"+$countryCode$number"
+
+ /** Outputs the phone number in a E.164-compliant way, e.g. +14151234567 */
+ def toE164String: String = toCompactString
+
+ /**
+ * Outputs the phone number in a "readable" way, e.g. "+1 415-123-45-67 ext. 1234"
+ * @throws IllegalStateException if the contents of this object is not a valid phone number
+ */
+ @throws[IllegalStateException]
+ def toHumanReadableString: String =
+ try {
+ val phoneNumber = PhoneNumber.phoneUtil.parse(toE164String, "US")
+ PhoneNumber.phoneUtil.format(phoneNumber, PhoneNumberFormat.INTERNATIONAL)
+ } catch {
+ case NonFatal(e) => throw new IllegalStateException(s"$toString is not a valid number", e)
+ }
+
override def toString: String = s"+$countryCode $number"
}
object PhoneNumber {
- private val phoneUtil = PhoneNumberUtil.getInstance()
+ private[PhoneNumber] val phoneUtil = PhoneNumberUtil.getInstance()
def parse(phoneNumber: String): Option[PhoneNumber] = {
- val validated =
- util.Try(phoneUtil.parseAndKeepRawInput(phoneNumber, "US")).toOption.filter(phoneUtil.isValidNumber)
- validated.map(pn => PhoneNumber(pn.getCountryCode.toString, pn.getNationalNumber.toString))
+ val validated = Try(phoneUtil.parseAndKeepRawInput(phoneNumber, "US")).toOption.filter(phoneUtil.isValidNumber)
+ validated.map { pn =>
+ PhoneNumber(pn.getCountryCode.toString, pn.getNationalNumber.toString)
+ }
}
}
}