VaultSlotRollback.kt

1.5 KB · raw

1package com.peachpasswords.vault23/** Restores the durable slot set after a partially committed vault transaction. */4internal class VaultSlotRollback(private val store: VaultStorage) {5    fun restoreTriad(6        priorA: StoredVault?,7        priorB: String?,8        priorD: StoredVault?,9    ): List<String> {10        val failures = mutableListOf<String>()11        if (priorA == null) {12            runCatching { store.clearVault() }.onFailure { failures += "clearVault: $it" }13            return failures14        }1516        attempt(failures, "writeSlotA") { store.writeSlotA(priorA) }17        if (priorB != null) attempt(failures, "writeSlotB") { store.writeSlotB(priorB) }18        if (priorD != null) {19            attempt(failures, "writeDecoySlot") { store.writeDecoySlot(priorD) }20        } else {21            runCatching { store.clearDecoySlot() }.onFailure { failures += "clearDecoySlot: $it" }22        }23        return failures24    }2526    fun restorePair(priorA: StoredVault, priorB: String?): List<String> {27        val failures = mutableListOf<String>()28        attempt(failures, "writeSlotA") { store.writeSlotA(priorA) }29        if (priorB != null) attempt(failures, "writeSlotB") { store.writeSlotB(priorB) }30        return failures31    }3233    private inline fun attempt(34        failures: MutableList<String>,35        operation: String,36        block: () -> Boolean,37    ) {38        runCatching { if (!block()) failures += "$operation returned false" }39            .onFailure { failures += "$operation: $it" }40    }41}