meta_language/
snapshots.rs1use std::sync::Arc;
2
3use crate::link_network::LinkNetwork;
4
5#[derive(Clone, Debug, PartialEq, Eq)]
7pub struct NetworkSnapshot {
8 version: u64,
9 parent_version: Option<u64>,
10 provenance: String,
11 network: Arc<LinkNetwork>,
12}
13
14impl NetworkSnapshot {
15 #[must_use]
17 pub fn new(version: u64, network: LinkNetwork, provenance: impl Into<String>) -> Self {
18 Self {
19 version,
20 parent_version: None,
21 provenance: provenance.into(),
22 network: Arc::new(network),
23 }
24 }
25
26 #[must_use]
28 pub const fn version(&self) -> u64 {
29 self.version
30 }
31
32 #[must_use]
34 pub const fn parent_version(&self) -> Option<u64> {
35 self.parent_version
36 }
37
38 #[must_use]
40 pub fn provenance(&self) -> &str {
41 &self.provenance
42 }
43
44 #[must_use]
46 pub fn network(&self) -> &LinkNetwork {
47 self.network.as_ref()
48 }
49
50 #[must_use]
52 pub fn shared_snapshot_count(&self) -> usize {
53 Arc::strong_count(&self.network)
54 }
55
56 #[must_use]
58 pub fn to_mutable(&self, provenance: impl Into<String>) -> MutableNetworkSnapshot {
59 MutableNetworkSnapshot {
60 base_version: self.version,
61 network: self.network().clone(),
62 provenance: provenance.into(),
63 }
64 }
65
66 fn committed(
67 version: u64,
68 parent_version: u64,
69 network: LinkNetwork,
70 provenance: String,
71 ) -> Self {
72 Self {
73 version,
74 parent_version: Some(parent_version),
75 provenance,
76 network: Arc::new(network),
77 }
78 }
79}
80
81#[derive(Clone, Debug, PartialEq, Eq)]
83pub struct MutableNetworkSnapshot {
84 base_version: u64,
85 network: LinkNetwork,
86 provenance: String,
87}
88
89impl MutableNetworkSnapshot {
90 #[must_use]
92 pub const fn base_version(&self) -> u64 {
93 self.base_version
94 }
95
96 #[must_use]
98 pub fn provenance(&self) -> &str {
99 &self.provenance
100 }
101
102 #[must_use]
104 pub const fn network(&self) -> &LinkNetwork {
105 &self.network
106 }
107
108 pub fn network_mut(&mut self) -> &mut LinkNetwork {
110 &mut self.network
111 }
112
113 #[must_use]
115 pub fn commit(self) -> NetworkSnapshot {
116 let next_version = self
117 .base_version
118 .checked_add(1)
119 .expect("snapshot version overflow");
120 self.commit_as(next_version)
121 }
122
123 #[must_use]
125 pub fn commit_as(self, version: u64) -> NetworkSnapshot {
126 assert!(
127 version > self.base_version,
128 "snapshot version must move forward"
129 );
130 NetworkSnapshot::committed(version, self.base_version, self.network, self.provenance)
131 }
132}
133
134impl LinkNetwork {
135 #[must_use]
137 pub fn snapshot(&self, version: u64, provenance: impl Into<String>) -> NetworkSnapshot {
138 NetworkSnapshot::new(version, self.clone(), provenance)
139 }
140}