ic_backup/model/application_ingress/request/
mod.rs1use super::{ApplicationIngressError, ApplicationIngressPayload};
4use crate::model::attempt_journal::MutationReservation;
5use crate::model::attempt_journal::MutationReservationError as Reservation;
6use crate::model::attempt_journal::ObservationReservation;
7use crate::model::{
8 attempt_journal::{AttemptAuthorityRecord, AttemptJournalRecord},
9 operation_plan::OperationPlanRecord,
10};
11
12#[derive(Debug)]
17pub struct ApplicationMutationRequest<'a> {
18 plan: &'a OperationPlanRecord,
19 payload: &'a ApplicationIngressPayload,
20 reservation: MutationReservation,
21}
22impl<'a> ApplicationMutationRequest<'a> {
23 pub fn new(
27 plan: &'a OperationPlanRecord,
28 sequence: u64,
29 journal: &AttemptJournalRecord,
30 payload: &'a ApplicationIngressPayload,
31 ) -> Result<Self, ApplicationIngressError> {
32 let authority = plan.attempt_authority_for_journal(
33 sequence,
34 journal,
35 ApplicationIngressError::AuthorityMismatch,
36 )?;
37 payload.validate_mutation_binding(authority.binding())?;
38 let reservation = MutationReservation::new(authority, journal)?;
39 Ok(Self {
40 plan,
41 payload,
42 reservation,
43 })
44 }
45 #[must_use]
47 pub const fn plan(&self) -> &OperationPlanRecord {
48 self.plan
49 }
50 #[must_use]
52 pub const fn payload(&self) -> &ApplicationIngressPayload {
53 self.payload
54 }
55 #[must_use]
57 pub const fn authority(&self) -> &AttemptAuthorityRecord {
58 &self.reservation.authority
59 }
60 #[must_use]
62 pub const fn mutation_attempt(&self) -> u32 {
63 self.reservation.mutation_attempt
64 }
65 pub fn validate_journal(
69 &self,
70 journal: &AttemptJournalRecord,
71 ) -> Result<(), ApplicationIngressError> {
72 self.reservation.validate(journal).map_err(Into::into)
73 }
74}
75
76#[derive(Debug)]
81pub struct ApplicationObservationRequest<'a> {
82 plan: &'a OperationPlanRecord,
83 payload: &'a ApplicationIngressPayload,
84 reservation: ObservationReservation,
85}
86impl<'a> ApplicationObservationRequest<'a> {
87 pub fn new(
91 plan: &'a OperationPlanRecord,
92 sequence: u64,
93 journal: &AttemptJournalRecord,
94 payload: &'a ApplicationIngressPayload,
95 ) -> Result<Self, ApplicationIngressError> {
96 let authority = plan.attempt_authority_for_journal(
97 sequence,
98 journal,
99 ApplicationIngressError::AuthorityMismatch,
100 )?;
101 payload.validate_observation_binding(authority.binding())?;
102 let reservation = ObservationReservation::new(authority, journal, payload.digest())
103 .map_err(crate::model::ic_observation::IcObservationRequestError::from)?;
104 Ok(Self {
105 plan,
106 payload,
107 reservation,
108 })
109 }
110 #[must_use]
112 pub const fn plan(&self) -> &OperationPlanRecord {
113 self.plan
114 }
115 #[must_use]
117 pub const fn payload(&self) -> &ApplicationIngressPayload {
118 self.payload
119 }
120 #[must_use]
122 pub const fn authority(&self) -> &AttemptAuthorityRecord {
123 &self.reservation.authority
124 }
125 #[must_use]
127 pub const fn mutation_attempt(&self) -> u32 {
128 self.reservation.mutation_attempt
129 }
130 #[must_use]
132 pub const fn observation_attempt(&self) -> u32 {
133 self.reservation.observation_attempt
134 }
135 pub fn validate_journal(
139 &self,
140 journal: &AttemptJournalRecord,
141 ) -> Result<(), ApplicationIngressError> {
142 self.reservation
143 .validate(journal)
144 .map_err(crate::model::ic_observation::IcObservationRequestError::from)?;
145 Ok(())
146 }
147}
148
149impl From<crate::model::attempt_journal::MutationReservationError> for ApplicationIngressError {
150 fn from(error: crate::model::attempt_journal::MutationReservationError) -> Self {
151 match error {
152 Reservation::NoPendingMutation => Self::NoPendingMutation,
153 Reservation::AuthorityMismatch => Self::AuthorityMismatch,
154 Reservation::MutationMismatch => Self::MutationMismatch,
155 Reservation::ObservationPending => Self::ObservationPending,
156 }
157 }
158}