made_core/entities/
council_journal_record.rs1use crate::entities::CouncilJournalEvent;
2use crate::value_objects::{AuthorizationEvidence, CouncilJournalPosition};
3use serde::{Deserialize, Serialize};
4
5#[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}