Я пытаюсь упростить процесс проверки ответов на запросы HTTP-запросов в Spray (я использую Slick для доступа к базе данных). В настоящее время я проверяю один запрос, если я должен перейти к следующему запросу или нет (ошибка возврата). В результате получается вложенное сопоставление шаблонов. Каждый случай проверки может возвращать разные ошибки, поэтому я не могу использовать flatMap.Scala - избегать слишком сложного вложенного соответствия шаблону
class LocationDao {
val db = DbProvider.db
// Database tables
val devices = Devices.devices
val locations = Locations.locations
val programs = Programs.programs
val accessTokens = AccessTokens.accessTokens
def loginDevice(deviceSerialNumber: String, login: String, password: String): Either[Error, LocationResponse] = {
try {
db withSession { implicit session =>
val deviceRowOption = devices.filter(d => d.serialNumber === deviceSerialNumber).map(d => (d.id, d.currentLocationId.?, d.serialNumber.?)).firstOption
deviceRowOption match {
case Some(deviceRow) => {
val locationRowOption = locations.filter(l => l.id === deviceRow._2.getOrElse(0L) && l.login === login && l.password === password).firstOption
locationRowOption match {
case Some(locationRow) => {
val programRowOption = programs.filter(p => p.id === locationRow.programId).firstOption
programRowOption match {
case Some(programRow) => {
val program = Program(programRow.name, programRow.logo, programRow.moneyLevel, programRow.pointsForLevel,
programRow.description, programRow.rules, programRow.dailyCustomerScansLimit)
val locationData = LocationData(program)
val locationResponse = LocationResponse("access_token", System.currentTimeMillis(), locationData)
Right(locationResponse)
}
case None => Left(ProgramNotExistError)
}
}
case None => Left(IncorrectLoginOrPasswordError)
}
}
case None => Left(DeviceNotExistError)
}
}
} catch {
case ex: SQLException =>
Left(DatabaseError)
}
}
}
Что такое хороший способ упростить это? Может быть, есть другой подход ..
Ваш образец кода слишком специфичен для того, что вы делаете, старайтесь быть более общим. Но для вашего вопроса, если вы измените методы xxxRowOption, чтобы вернуть «Либо», вы сможете использовать их для понимания. – Maxim
Используйте для понимания. –
Я переработал этот код с пониманием. Благодарю. – piobab