Skip to main content

made_core/entities/
council_journal_record.rs

1use crate::entities::CouncilJournalEvent;
2use crate::value_objects::{AuthorizationEvidence, CouncilJournalPosition};
3use serde::{Deserialize, Serialize};
4
5/// A durable council fact sealed at one position, returned unchanged on replay.
6#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
7pub struct CouncilJournalRecord {
8    position: CouncilJournalPosition,
9    event: CouncilJournalEvent,
10    #[serde(default, skip_serializing_if = "Option::is_none")]
11    authorization: Option<AuthorizationEvidence>,
12}
13impl CouncilJournalRecord {
14    #[must_use]
15    pub fn new(position: CouncilJournalPosition, event: CouncilJournalEvent) -> Self {
16        Self {
17            position,
18            event,
19            authorization: None,
20        }
21    }
22    #[must_use]
23    pub fn authorized(
24        position: CouncilJournalPosition,
25        event: CouncilJournalEvent,
26        authorization: AuthorizationEvidence,
27    ) -> Self {
28        Self {
29            position,
30            event,
31            authorization: Some(authorization),
32        }
33    }
34    #[must_use]
35    pub fn position(&self) -> CouncilJournalPosition {
36        self.position
37    }
38    #[must_use]
39    pub fn event(&self) -> &CouncilJournalEvent {
40        &self.event
41    }
42    #[must_use]
43    pub fn authorization(&self) -> Option<&AuthorizationEvidence> {
44        self.authorization.as_ref()
45    }
46}
47
48#[cfg(test)]
49mod tests {
50    use super::*;
51    use crate::value_objects::Specialty;
52
53    #[test]
54    fn historical_record_without_authorization_keeps_its_exact_json() {
55        let historical = r#"{"position":1,"event":{"kind":"council_deleted","fact":"research"}}"#;
56        let record: CouncilJournalRecord = serde_json::from_str(historical).unwrap();
57
58        assert!(record.authorization().is_none());
59        assert_eq!(serde_json::to_string(&record).unwrap(), historical);
60        assert_eq!(
61            record.event(),
62            &CouncilJournalEvent::CouncilDeleted(Specialty::new("research").unwrap())
63        );
64    }
65}