Skip to main content

arcp_core/messages/
artifacts.rs

1//! Artifact messages (RFC §16).
2
3use serde::{Deserialize, Serialize};
4
5use crate::ids::ArtifactId;
6
7/// Canonical artifact reference (RFC §16.1).
8#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
9pub struct ArtifactRef {
10    /// Artifact id.
11    pub artifact_id: ArtifactId,
12    /// `arcp://` URI for the artifact.
13    pub uri: String,
14    /// Media type.
15    pub media_type: String,
16    /// Size in bytes (decoded).
17    pub size: u64,
18    /// Optional integrity hash.
19    #[serde(default, skip_serializing_if = "Option::is_none")]
20    pub sha256: Option<String>,
21    /// Optional retention deadline.
22    #[serde(default, skip_serializing_if = "Option::is_none")]
23    pub expires_at: Option<chrono::DateTime<chrono::Utc>>,
24}
25
26/// Payload for `artifact.put`.
27#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
28pub struct ArtifactPutPayload {
29    /// Media type.
30    pub media_type: String,
31    /// Inline base64 body.
32    pub data: String,
33    /// Optional pre-computed integrity hash.
34    #[serde(default, skip_serializing_if = "Option::is_none")]
35    pub sha256: Option<String>,
36    /// Optional retention duration in seconds.
37    #[serde(default, skip_serializing_if = "Option::is_none")]
38    pub retain_seconds: Option<u64>,
39}
40
41/// Payload for `artifact.fetch`.
42#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
43pub struct ArtifactFetchPayload {
44    /// Artifact to fetch.
45    pub artifact_id: ArtifactId,
46}
47
48/// Payload for `artifact.ref`.
49#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
50pub struct ArtifactRefPayload {
51    /// Reference body.
52    pub artifact: ArtifactRef,
53}
54
55/// Payload for `artifact.release`.
56#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
57pub struct ArtifactReleasePayload {
58    /// Artifact to release.
59    pub artifact_id: ArtifactId,
60}