Текущая подпись getMacsByAccount
равна
def getMacsByAccount(macs: List[String], ...): Try[List[EquipmentHealth]]
Это позволяет получить один Success
/ Failure
результат, и вы не можете проверить каждый mac
независимо.Если вы хотите отслеживать состояние ошибки каждого mac
, вам нужно вернуть List[Try[EquipmentHealth]]
вместо Try[List[EquipmentHealth]]
:
def getMacsByAccount(macs: List[String], ...): List[Try[EquipmentHealth]]
Для реализации этого нужно просто изменить getMacsByAccount
:
def getMacsByAccount(macs: List[String], equipments: List[Equipment]): List[Try[EquipmentHealth]] =
for {
mac <- macs
equipment <- equipments.filter(_.macs.contains(mac))
statuses = StatusChecker.checkBatchStatuses(equipment.primaryMacs)
} yield
statuses.flatMap(resolveStatus(_, mac))
Примечание: В данный момент resolveStatus
всегда возвращает Success
, и в этом случае он может также просто вернуть EquipmentHealth
.Если вы измените это, измените flatMap
выше на map
.
Редактировать после комментариев
Если вам нужен только один провал или успех, оберните все это в Try
и распакуйте внутренние значения Try
, используя get
:
def getMacsByAccount(macs: List[String], equipments: List[Equipment]): Try[List[EquipmentHealth]] =
Try {
for {
mac <- macs
equipment <- equipments.filter(_.macs.contains(mac))
statuses = StatusChecker.checkBatchStatuses(equipment.primaryMacs).get
} yield resolveStatus(statuses, mac).get
}
Если любое из значений Try
равно Failure
, то get
сгенерирует исключение, которое перехватывается внешним Try
.
Конечно, было бы проще, если бы checkBatchStatuses
и resolveStatus
просто выдавали исключение при сбое, а не возвращали Try
.