use crate::{
model::{
attempt_journal::AttemptJournalRecord,
ic_snapshot_data::{IcSnapshotDataError, IcSnapshotDataReply},
ic_snapshot_upload_data_observation::{
IcSnapshotUploadDataObservationRequest, IcSnapshotUploadDataObservationResponse,
},
},
policy::ic_observation::{IcObservationAssociationError, ObservationClaims, validate_claims},
};
use thiserror::Error;
mod settlement;
pub use settlement::{
IcSnapshotUploadDataSettlementError, IcSnapshotUploadDataSettlementView, validate_settlement,
};
#[derive(Debug)]
pub struct IcSnapshotUploadDataObservationView<'request, 'metadata> {
response: &'request IcSnapshotUploadDataObservationResponse,
reply: IcSnapshotDataReply<'request, 'metadata>,
matches_original_chunk: bool,
}
impl<'request, 'metadata> IcSnapshotUploadDataObservationView<'request, 'metadata> {
#[must_use]
pub const fn response(&self) -> &'request IcSnapshotUploadDataObservationResponse {
self.response
}
#[must_use]
pub const fn reply(&self) -> &IcSnapshotDataReply<'request, 'metadata> {
&self.reply
}
#[must_use]
pub const fn matches_original_chunk(&self) -> bool {
self.matches_original_chunk
}
}
pub fn validate_response<'request, 'metadata>(
request: &IcSnapshotUploadDataObservationRequest<'request, '_, 'metadata>,
journal: &AttemptJournalRecord,
response: &'request IcSnapshotUploadDataObservationResponse,
) -> Result<
IcSnapshotUploadDataObservationView<'request, 'metadata>,
IcSnapshotUploadDataObservationAssociationError,
> {
request
.validate_journal(journal)
.map_err(IcObservationAssociationError::from)?;
validate_claims(
&ObservationClaims {
authority: request.authority(),
mutation_attempt: request.mutation_attempt(),
observation_attempt: request.observation_attempt(),
request: request.payload().digest(),
context: request.plan().context(),
target: request.payload().target(),
},
response.input(),
)?;
let reply = IcSnapshotDataReply::decode(request.payload(), &response.input().reply)?;
let matches_original_chunk = reply.chunk_checksum() == request.original_chunk_checksum();
Ok(IcSnapshotUploadDataObservationView {
response,
reply,
matches_original_chunk,
})
}
#[derive(Debug, Error)]
pub enum IcSnapshotUploadDataObservationAssociationError {
#[error(transparent)]
Association(#[from] IcObservationAssociationError),
#[error(transparent)]
Data(#[from] IcSnapshotDataError),
}
#[cfg(test)]
mod tests;