Skip to main content

made_core/entities/
published_agentic_system.rs

1//! [`PublishedAgenticSystem`] — a design fixed to a content identity.
2
3use serde::{Deserialize, Serialize};
4use time::OffsetDateTime;
5
6use crate::error::DomainError;
7use crate::value_objects::{
8    AgenticSystemDigest, AgenticSystemId, AgenticSystemRevision, SystemPin,
9};
10
11use super::AgenticSystem;
12
13/// A sealed revision of an agentic system, and the digest that says
14/// which bytes it is.
15#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
16pub struct PublishedAgenticSystem {
17    system: AgenticSystem,
18    digest: AgenticSystemDigest,
19    #[serde(with = "time::serde::rfc3339")]
20    published_at: OffsetDateTime,
21}
22
23impl PublishedAgenticSystem {
24    /// Fix a design to its content identity.
25    pub fn seal(system: AgenticSystem, published_at: OffsetDateTime) -> Result<Self, DomainError> {
26        let digest = system.digest()?;
27        Ok(Self {
28            system,
29            digest,
30            published_at,
31        })
32    }
33
34    #[must_use]
35    pub const fn system(&self) -> &AgenticSystem {
36        &self.system
37    }
38
39    #[must_use]
40    pub const fn digest(&self) -> AgenticSystemDigest {
41        self.digest
42    }
43
44    #[must_use]
45    pub const fn published_at(&self) -> OffsetDateTime {
46        self.published_at
47    }
48
49    #[must_use]
50    pub fn id(&self) -> &AgenticSystemId {
51        self.system.id()
52    }
53
54    #[must_use]
55    pub fn revision(&self) -> AgenticSystemRevision {
56        self.system.revision()
57    }
58
59    /// How a run names this exact design.
60    #[must_use]
61    pub fn pin(&self) -> SystemPin {
62        SystemPin::new(self.id().clone(), self.revision(), self.digest)
63    }
64
65    #[must_use]
66    pub fn into_system(self) -> AgenticSystem {
67        self.system
68    }
69}