ic_backup/model/attempt_journal/mutation/
mod.rs1use super::{AttemptAuthorityRecord, AttemptJournalRecord};
3
4#[derive(Debug)]
5pub(crate) struct MutationReservation {
6 pub authority: AttemptAuthorityRecord,
7 pub mutation_attempt: u32,
8}
9impl MutationReservation {
10 pub(crate) fn new(
11 authority: AttemptAuthorityRecord,
12 journal: &AttemptJournalRecord,
13 ) -> Result<Self, MutationReservationError> {
14 let mutation_attempt = journal
15 .pending_mutation()
16 .ok_or(MutationReservationError::NoPendingMutation)?;
17 let reservation = Self {
18 authority,
19 mutation_attempt,
20 };
21 reservation.validate(journal)?;
22 Ok(reservation)
23 }
24 pub(crate) fn validate(
25 &self,
26 journal: &AttemptJournalRecord,
27 ) -> Result<(), MutationReservationError> {
28 journal.validate_pending_mutation(&self.authority, self.mutation_attempt)
29 }
30}
31
32#[derive(Clone, Copy, Debug, Eq, PartialEq, thiserror::Error)]
34pub enum MutationReservationError {
35 #[error("original mutation requires a pending reservation")]
37 NoPendingMutation,
38 #[error("original mutation reservation authority mismatch")]
40 AuthorityMismatch,
41 #[error("original mutation reservation changed or settled")]
43 MutationMismatch,
44 #[error("original mutation reservation has a pending observation")]
46 ObservationPending,
47}