ic_backup/model/application_ingress/request/
mod.rs1use super::{ApplicationIngressError, ApplicationIngressPayload};
4use crate::model::attempt_journal::MutationReservation;
5use crate::model::attempt_journal::ObservationReservation;
6use crate::model::{
7 attempt_journal::{AttemptAuthorityRecord, AttemptJournalRecord},
8 operation_plan::OperationPlanRecord,
9};
10
11#[derive(Debug)]
16pub struct ApplicationMutationRequest<'a> {
17 plan: &'a OperationPlanRecord,
18 payload: &'a ApplicationIngressPayload,
19 reservation: MutationReservation,
20}
21impl<'a> ApplicationMutationRequest<'a> {
22 pub fn new(
26 plan: &'a OperationPlanRecord,
27 sequence: u64,
28 journal: &AttemptJournalRecord,
29 payload: &'a ApplicationIngressPayload,
30 ) -> Result<Self, ApplicationIngressError> {
31 let authority = plan.attempt_authority_for_journal(
32 sequence,
33 journal,
34 ApplicationIngressError::Reservation(
35 crate::model::attempt_journal::MutationReservationError::AuthorityMismatch,
36 ),
37 )?;
38 payload.validate_mutation_binding(authority.binding())?;
39 let reservation = MutationReservation::new(authority, journal)?;
40 Ok(Self {
41 plan,
42 payload,
43 reservation,
44 })
45 }
46 #[must_use]
48 pub const fn plan(&self) -> &OperationPlanRecord {
49 self.plan
50 }
51 #[must_use]
53 pub const fn payload(&self) -> &ApplicationIngressPayload {
54 self.payload
55 }
56 #[must_use]
58 pub const fn authority(&self) -> &AttemptAuthorityRecord {
59 &self.reservation.authority
60 }
61 #[must_use]
63 pub const fn mutation_attempt(&self) -> u32 {
64 self.reservation.mutation_attempt
65 }
66 pub fn validate_journal(
70 &self,
71 journal: &AttemptJournalRecord,
72 ) -> Result<(), ApplicationIngressError> {
73 self.reservation.validate(journal).map_err(Into::into)
74 }
75}
76
77#[derive(Debug)]
82pub struct ApplicationObservationRequest<'a> {
83 plan: &'a OperationPlanRecord,
84 payload: &'a ApplicationIngressPayload,
85 reservation: ObservationReservation,
86}
87impl<'a> ApplicationObservationRequest<'a> {
88 pub fn new(
92 plan: &'a OperationPlanRecord,
93 sequence: u64,
94 journal: &AttemptJournalRecord,
95 payload: &'a ApplicationIngressPayload,
96 ) -> Result<Self, ApplicationIngressError> {
97 let authority = plan.attempt_authority_for_journal(
98 sequence,
99 journal,
100 ApplicationIngressError::Reservation(
101 crate::model::attempt_journal::MutationReservationError::AuthorityMismatch,
102 ),
103 )?;
104 payload.validate_observation_binding(authority.binding())?;
105 let reservation = ObservationReservation::new(authority, journal, payload.digest())
106 .map_err(crate::model::ic_observation::IcObservationRequestError::from)?;
107 Ok(Self {
108 plan,
109 payload,
110 reservation,
111 })
112 }
113 #[must_use]
115 pub const fn plan(&self) -> &OperationPlanRecord {
116 self.plan
117 }
118 #[must_use]
120 pub const fn payload(&self) -> &ApplicationIngressPayload {
121 self.payload
122 }
123 #[must_use]
125 pub const fn authority(&self) -> &AttemptAuthorityRecord {
126 &self.reservation.authority
127 }
128 #[must_use]
130 pub const fn mutation_attempt(&self) -> u32 {
131 self.reservation.mutation_attempt
132 }
133 #[must_use]
135 pub const fn observation_attempt(&self) -> u32 {
136 self.reservation.observation_attempt
137 }
138 pub fn validate_journal(
142 &self,
143 journal: &AttemptJournalRecord,
144 ) -> Result<(), ApplicationIngressError> {
145 self.reservation
146 .validate(journal)
147 .map_err(crate::model::ic_observation::IcObservationRequestError::from)?;
148 Ok(())
149 }
150}