Skip to main content

made_core/value_objects/artifact/
artifact_ref.rs

1use serde::{Deserialize, Serialize};
2
3use super::{ArtifactDigest, ArtifactId, ArtifactMediaType, ArtifactProvenance, ArtifactSizeBytes};
4use crate::error::DomainError;
5
6/// Verifiable artifact metadata. It never contains storage coordinates or bytes.
7#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
8pub struct ArtifactRef {
9    artifact_id: ArtifactId,
10    digest: ArtifactDigest,
11    size_bytes: ArtifactSizeBytes,
12    media_type: ArtifactMediaType,
13    provenance: ArtifactProvenance,
14}
15
16impl ArtifactRef {
17    #[must_use]
18    pub const fn new(
19        artifact_id: ArtifactId,
20        digest: ArtifactDigest,
21        size_bytes: ArtifactSizeBytes,
22        media_type: ArtifactMediaType,
23        provenance: ArtifactProvenance,
24    ) -> Self {
25        Self {
26            artifact_id,
27            digest,
28            size_bytes,
29            media_type,
30            provenance,
31        }
32    }
33
34    #[must_use]
35    pub const fn artifact_id(&self) -> &ArtifactId {
36        &self.artifact_id
37    }
38
39    #[must_use]
40    pub const fn digest(&self) -> &ArtifactDigest {
41        &self.digest
42    }
43
44    #[must_use]
45    pub const fn size_bytes(&self) -> ArtifactSizeBytes {
46        self.size_bytes
47    }
48
49    #[must_use]
50    pub const fn media_type(&self) -> &ArtifactMediaType {
51        &self.media_type
52    }
53
54    #[must_use]
55    pub const fn provenance(&self) -> &ArtifactProvenance {
56        &self.provenance
57    }
58
59    /// Re-check nested provenance after deserialization.
60    pub fn validate(&self) -> Result<(), DomainError> {
61        self.provenance.validate()
62    }
63}