---
# System prepended metadata

title: Question

---

# Question

Implement the function `retrieveAddress` using the methods `getStreet1`, `getStreet2`, and `getStreet3` to create an `Address`.

```scala
case class Address(
  street1: String,
  street2: Option[String],
  street3: Option[String]
)

case object AddressNotFound

def retrieveAddress: Either[AddressNotFound, Address] = {
    // TODO: Implement
    val address =
        for {
          street1 <- Try { getStreet1() }.toOption
          street2 = Try { getStreet2() }.toOption
          street3 = Try { getStreet3() }.toOption
        } yield Address(street1, street2, street3)

   address match {
     case Some(a) => Right(a)
     case None    => Left(AddressNotFound)
   }
    
}



// =======================================================================  
// LIBRARY METHODS 
// =======================================================================

/**
  * Retrieves the main street address.
  * @throws RuntimeException if empty
  */
def getStreet1: String = {
  // implementation
  
}

/**
  * Retrieves additional street address line 2.
  * @throws RuntimeException if empty
  */
def getStreet2: String = {
  // implementation
}

/**
  * Retrieves additional street address line 3.
  * @throws RuntimeException if empty
  */
def getStreet3: String = {
  // implementation
}

```