use super::{ArtifactStateRecord, DownloadJournalRecord};
use serde::Serialize;
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize)]
pub enum ResumeAction {
Download,
VerifyChecksum,
Finalize,
Skip,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
pub struct DownloadArtifactView {
pub canister_id: String,
pub snapshot_id: String,
pub state: ArtifactStateRecord,
pub resume_action: ResumeAction,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
pub struct DownloadJournalView {
pub intent: String,
pub pending_artifacts: usize,
pub is_complete: bool,
pub artifacts: Vec<DownloadArtifactView>,
}
impl DownloadJournalRecord {
#[must_use]
pub fn resume_view(&self) -> DownloadJournalView {
let artifacts: Vec<_> = self
.artifacts()
.iter()
.map(|artifact| DownloadArtifactView {
canister_id: artifact.canister_id().to_owned(),
snapshot_id: artifact.snapshot_id().to_owned(),
state: artifact.state(),
resume_action: match artifact.state() {
ArtifactStateRecord::Created => ResumeAction::Download,
ArtifactStateRecord::Downloaded => ResumeAction::VerifyChecksum,
ArtifactStateRecord::ChecksumVerified => ResumeAction::Finalize,
ArtifactStateRecord::Durable => ResumeAction::Skip,
},
})
.collect();
let pending_artifacts = artifacts
.iter()
.filter(|entry| entry.state != ArtifactStateRecord::Durable)
.count();
DownloadJournalView {
intent: self.intent().to_owned(),
pending_artifacts,
is_complete: pending_artifacts == 0,
artifacts,
}
}
}