package com.peachpasswords.vault /** Restores the durable slot set after a partially committed vault transaction. */ internal class VaultSlotRollback(private val store: VaultStorage) { fun restoreTriad( priorA: StoredVault?, priorB: String?, priorD: StoredVault?, ): List { val failures = mutableListOf() if (priorA == null) { runCatching { store.clearVault() }.onFailure { failures += "clearVault: $it" } return failures } attempt(failures, "writeSlotA") { store.writeSlotA(priorA) } if (priorB != null) attempt(failures, "writeSlotB") { store.writeSlotB(priorB) } if (priorD != null) { attempt(failures, "writeDecoySlot") { store.writeDecoySlot(priorD) } } else { runCatching { store.clearDecoySlot() }.onFailure { failures += "clearDecoySlot: $it" } } return failures } fun restorePair(priorA: StoredVault, priorB: String?): List { val failures = mutableListOf() attempt(failures, "writeSlotA") { store.writeSlotA(priorA) } if (priorB != null) attempt(failures, "writeSlotB") { store.writeSlotB(priorB) } return failures } private inline fun attempt( failures: MutableList, operation: String, block: () -> Boolean, ) { runCatching { if (!block()) failures += "$operation returned false" } .onFailure { failures += "$operation: $it" } } }