ic_backup/policy/ic_snapshot_transfer_read/
mod.rs1use crate::model::{
4 attempt_journal::AttemptJournalRecord,
5 ic_snapshot_data::{IcSnapshotDataError, IcSnapshotDataReply},
6 ic_snapshot_metadata::{IcSnapshotMetadataError, IcSnapshotMetadataReply},
7 ic_snapshot_transfer_read::{
8 IcSnapshotTransferReadError, IcSnapshotTransferReadPayload, IcSnapshotTransferReadRequest,
9 IcSnapshotTransferReadResponse,
10 },
11};
12use thiserror::Error;
13
14#[derive(Debug)]
16pub enum IcSnapshotTransferReadReply<'request, 'metadata> {
17 Metadata(IcSnapshotMetadataReply<'request>),
19 Data(IcSnapshotDataReply<'request, 'metadata>),
21}
22
23#[derive(Debug)]
25pub struct IcSnapshotTransferReadView<'request, 'metadata> {
26 response: &'request IcSnapshotTransferReadResponse,
27 reply: IcSnapshotTransferReadReply<'request, 'metadata>,
28}
29
30impl<'request, 'metadata> IcSnapshotTransferReadView<'request, 'metadata> {
31 #[must_use]
33 pub const fn response(&self) -> &'request IcSnapshotTransferReadResponse {
34 self.response
35 }
36 #[must_use]
38 pub const fn reply(&self) -> &IcSnapshotTransferReadReply<'request, 'metadata> {
39 &self.reply
40 }
41}
42
43pub fn validate_response<'request, 'metadata>(
52 request: &IcSnapshotTransferReadRequest<'request, 'metadata>,
53 journal: &AttemptJournalRecord,
54 response: &'request IcSnapshotTransferReadResponse,
55) -> Result<IcSnapshotTransferReadView<'request, 'metadata>, IcSnapshotTransferReadAssociationError>
56{
57 request.validate_journal(journal)?;
58 let input = response.input();
59 if input.authority != request.authority().digest() {
60 return Err(IcSnapshotTransferReadAssociationError::AuthorityMismatch);
61 }
62 if input.mutation_attempt != request.mutation_attempt() {
63 return Err(IcSnapshotTransferReadAssociationError::AttemptMismatch);
64 }
65 if &input.context != request.plan().context() {
66 return Err(IcSnapshotTransferReadAssociationError::ContextMismatch);
67 }
68 if input.target != request.payload().target() {
69 return Err(IcSnapshotTransferReadAssociationError::TargetMismatch);
70 }
71 let reply = match request.payload() {
72 IcSnapshotTransferReadPayload::Metadata(payload) => IcSnapshotTransferReadReply::Metadata(
73 IcSnapshotMetadataReply::decode(payload, &input.reply)?,
74 ),
75 IcSnapshotTransferReadPayload::Data(payload) => {
76 IcSnapshotTransferReadReply::Data(IcSnapshotDataReply::decode(payload, &input.reply)?)
77 }
78 };
79 Ok(IcSnapshotTransferReadView { response, reply })
80}
81
82#[derive(Debug, Error)]
84pub enum IcSnapshotTransferReadAssociationError {
85 #[error(transparent)]
87 Reservation(#[from] IcSnapshotTransferReadError),
88 #[error("snapshot transfer read response authority differs")]
90 AuthorityMismatch,
91 #[error("snapshot transfer read response attempt differs")]
93 AttemptMismatch,
94 #[error("snapshot transfer read response context differs")]
96 ContextMismatch,
97 #[error("snapshot transfer read response target differs")]
99 TargetMismatch,
100 #[error(transparent)]
102 Metadata(#[from] IcSnapshotMetadataError),
103 #[error(transparent)]
105 Data(#[from] IcSnapshotDataError),
106}
107
108#[cfg(test)]
109mod tests;