Skip to main content

ic_backup/model/attempt_journal/mutation/
mod.rs

1//! Passive original pending mutation identity, without spending or dispatch authority.
2use 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/// Exact original pending-mutation refusal; no variant spends or authorizes a call.
33#[derive(Clone, Copy, Debug, Eq, PartialEq, thiserror::Error)]
34pub enum MutationReservationError {
35    /// No original unresolved mutation is retained.
36    #[error("original mutation requires a pending reservation")]
37    NoPendingMutation,
38    /// Full original authority, including immutable allowances, differs.
39    #[error("original mutation reservation authority mismatch")]
40    AuthorityMismatch,
41    /// The original pending mutation changed or settled after binding.
42    #[error("original mutation reservation changed or settled")]
43    MutationMismatch,
44    /// Separately accounted observation recovery is pending.
45    #[error("original mutation reservation has a pending observation")]
46    ObservationPending,
47}