membership-attribute-service/app/models/DeliveryAddress.scala (42 lines of code) (raw):

package models import com.gu.salesforce.Contact import play.api.libs.json.{Format, Json} case class DeliveryAddress( addressLine1: Option[String], addressLine2: Option[String], town: Option[String], region: Option[String], postcode: Option[String], country: Option[String], addressChangeInformation: Option[String], instructions: Option[String], ) object DeliveryAddress { implicit val format: Format[DeliveryAddress] = Json.format[DeliveryAddress] def fromContact(contact: Contact): DeliveryAddress = { val addressLines = splitAddressLines(contact.mailingStreet) DeliveryAddress( addressLine1 = addressLines.map(_._1), addressLine2 = addressLines.map(_._2), town = contact.mailingCity, region = contact.mailingState, postcode = contact.mailingPostcode, country = contact.mailingCountry, addressChangeInformation = None, instructions = contact.deliveryInstructions, ) } def splitAddressLines(addressLine: Option[String]): Option[(String, String)] = addressLine map { line => val n = line.lastIndexOf(',') if (n == -1) (line, "") else (line.take(n).trim, line.drop(n + 1).trim) } def mergeAddressLines(address: DeliveryAddress): Option[String] = (address.addressLine1, address.addressLine2) match { case (Some(line1), Some(line2)) => Some(s"${line1.trim},${line2.trim}") case (Some(line1), None) => Some(line1.trim) case (None, Some(line2)) => Some(line2.trim) case (None, None) => None } }