1pub(crate) mod v0;
2
3pub use v0::*;
4
5use crate::document::Document;
6use crate::identity::TimestampMillis;
7use crate::prelude::{BlockHeight, CoreBlockHeight, Revision};
8use platform_value::{Identifier, Value};
9use std::collections::BTreeMap;
10
11impl DocumentV0Getters for Document {
12 fn id(&self) -> Identifier {
13 match self {
14 Document::V0(v0) => v0.id,
15 }
16 }
17
18 fn id_ref(&self) -> &Identifier {
19 match self {
20 Document::V0(v0) => &v0.id,
21 }
22 }
23
24 fn owner_id(&self) -> Identifier {
25 match self {
26 Document::V0(v0) => v0.owner_id,
27 }
28 }
29
30 fn owner_id_ref(&self) -> &Identifier {
31 match self {
32 Document::V0(v0) => &v0.owner_id,
33 }
34 }
35
36 fn properties(&self) -> &BTreeMap<String, Value> {
37 match self {
38 Document::V0(v0) => &v0.properties,
39 }
40 }
41
42 fn properties_mut(&mut self) -> &mut BTreeMap<String, Value> {
43 match self {
44 Document::V0(v0) => &mut v0.properties,
45 }
46 }
47
48 fn properties_consumed(self) -> BTreeMap<String, Value> {
49 match self {
50 Document::V0(v0) => v0.properties,
51 }
52 }
53
54 fn revision(&self) -> Option<Revision> {
55 match self {
56 Document::V0(v0) => v0.revision,
57 }
58 }
59
60 fn created_at(&self) -> Option<TimestampMillis> {
61 match self {
62 Document::V0(v0) => v0.created_at,
63 }
64 }
65
66 fn updated_at(&self) -> Option<TimestampMillis> {
67 match self {
68 Document::V0(v0) => v0.updated_at,
69 }
70 }
71
72 fn transferred_at(&self) -> Option<TimestampMillis> {
73 match self {
74 Document::V0(v0) => v0.transferred_at,
75 }
76 }
77
78 fn created_at_block_height(&self) -> Option<BlockHeight> {
79 match self {
80 Document::V0(v0) => v0.created_at_block_height,
81 }
82 }
83
84 fn updated_at_block_height(&self) -> Option<BlockHeight> {
85 match self {
86 Document::V0(v0) => v0.updated_at_block_height,
87 }
88 }
89
90 fn transferred_at_block_height(&self) -> Option<BlockHeight> {
91 match self {
92 Document::V0(v0) => v0.transferred_at_block_height,
93 }
94 }
95
96 fn created_at_core_block_height(&self) -> Option<CoreBlockHeight> {
97 match self {
98 Document::V0(v0) => v0.created_at_core_block_height,
99 }
100 }
101
102 fn updated_at_core_block_height(&self) -> Option<CoreBlockHeight> {
103 match self {
104 Document::V0(v0) => v0.updated_at_core_block_height,
105 }
106 }
107
108 fn transferred_at_core_block_height(&self) -> Option<CoreBlockHeight> {
109 match self {
110 Document::V0(v0) => v0.transferred_at_core_block_height,
111 }
112 }
113
114 fn creator_id(&self) -> Option<Identifier> {
115 match self {
116 Document::V0(v0) => v0.creator_id,
117 }
118 }
119}
120
121impl DocumentV0Setters for Document {
122 fn set_id(&mut self, id: Identifier) {
123 match self {
124 Document::V0(v0) => v0.id = id,
125 }
126 }
127
128 fn set_owner_id(&mut self, owner_id: Identifier) {
129 match self {
130 Document::V0(v0) => v0.owner_id = owner_id,
131 }
132 }
133
134 fn set_properties(&mut self, properties: BTreeMap<String, Value>) {
135 match self {
136 Document::V0(v0) => v0.properties = properties,
137 }
138 }
139
140 fn set_revision(&mut self, revision: Option<Revision>) {
141 match self {
142 Document::V0(v0) => v0.revision = revision,
143 }
144 }
145
146 fn bump_revision(&mut self) {
147 match self {
148 Document::V0(v0) => v0.bump_revision(),
149 }
150 }
151
152 fn set_created_at(&mut self, created_at: Option<TimestampMillis>) {
153 match self {
154 Document::V0(v0) => v0.created_at = created_at,
155 }
156 }
157
158 fn set_updated_at(&mut self, updated_at: Option<TimestampMillis>) {
159 match self {
160 Document::V0(v0) => v0.updated_at = updated_at,
161 }
162 }
163
164 fn set_transferred_at(&mut self, transferred_at: Option<TimestampMillis>) {
165 match self {
166 Document::V0(v0) => v0.transferred_at = transferred_at,
167 }
168 }
169
170 fn set_created_at_block_height(&mut self, created_at_block_height: Option<u64>) {
171 match self {
172 Document::V0(v0) => v0.created_at_block_height = created_at_block_height,
173 }
174 }
175
176 fn set_updated_at_block_height(&mut self, updated_at_block_height: Option<u64>) {
177 match self {
178 Document::V0(v0) => v0.updated_at_block_height = updated_at_block_height,
179 }
180 }
181
182 fn set_transferred_at_block_height(&mut self, transferred_at_block_height: Option<u64>) {
183 match self {
184 Document::V0(v0) => v0.transferred_at_block_height = transferred_at_block_height,
185 }
186 }
187
188 fn set_created_at_core_block_height(&mut self, created_at_core_block_height: Option<u32>) {
189 match self {
190 Document::V0(v0) => v0.created_at_core_block_height = created_at_core_block_height,
191 }
192 }
193
194 fn set_updated_at_core_block_height(&mut self, updated_at_core_block_height: Option<u32>) {
195 match self {
196 Document::V0(v0) => v0.updated_at_core_block_height = updated_at_core_block_height,
197 }
198 }
199
200 fn set_transferred_at_core_block_height(
201 &mut self,
202 transferred_at_core_block_height: Option<u32>,
203 ) {
204 match self {
205 Document::V0(v0) => {
206 v0.transferred_at_core_block_height = transferred_at_core_block_height
207 }
208 }
209 }
210
211 fn set_creator_id(&mut self, creator_id: Option<Identifier>) {
212 match self {
213 Document::V0(v0) => v0.creator_id = creator_id,
214 }
215 }
216}
217
218#[cfg(test)]
219mod tests {
220 use super::*;
221 use crate::document::v0::DocumentV0;
222 use crate::prelude::Revision;
223
224 fn make_doc() -> Document {
225 Document::V0(DocumentV0 {
226 id: Identifier::new([1u8; 32]),
227 owner_id: Identifier::new([2u8; 32]),
228 properties: BTreeMap::new(),
229 revision: Some(1),
230 created_at: Some(10),
231 updated_at: Some(20),
232 transferred_at: Some(30),
233 created_at_block_height: Some(100),
234 updated_at_block_height: Some(200),
235 transferred_at_block_height: Some(300),
236 created_at_core_block_height: Some(1),
237 updated_at_core_block_height: Some(2),
238 transferred_at_core_block_height: Some(3),
239 creator_id: Some(Identifier::new([9u8; 32])),
240 })
241 }
242
243 #[test]
248 fn getters_forward_all_fields_to_v0() {
249 let doc = make_doc();
250 assert_eq!(doc.id(), Identifier::new([1u8; 32]));
251 assert_eq!(doc.owner_id(), Identifier::new([2u8; 32]));
252 assert_eq!(doc.id_ref(), &Identifier::new([1u8; 32]));
253 assert_eq!(doc.owner_id_ref(), &Identifier::new([2u8; 32]));
254 assert_eq!(doc.revision(), Some(1));
255 assert_eq!(doc.created_at(), Some(10));
256 assert_eq!(doc.updated_at(), Some(20));
257 assert_eq!(doc.transferred_at(), Some(30));
258 assert_eq!(doc.created_at_block_height(), Some(100));
259 assert_eq!(doc.updated_at_block_height(), Some(200));
260 assert_eq!(doc.transferred_at_block_height(), Some(300));
261 assert_eq!(doc.created_at_core_block_height(), Some(1));
262 assert_eq!(doc.updated_at_core_block_height(), Some(2));
263 assert_eq!(doc.transferred_at_core_block_height(), Some(3));
264 assert_eq!(doc.creator_id(), Some(Identifier::new([9u8; 32])));
265 assert!(doc.properties().is_empty());
266 }
267
268 #[test]
273 fn properties_consumed_forwards_to_v0() {
274 let Document::V0(mut v0) = make_doc();
275 v0.properties.insert("k".into(), Value::U64(77));
276 let doc = Document::V0(v0);
277 let map = doc.properties_consumed();
278 assert_eq!(map.get("k"), Some(&Value::U64(77)));
279 }
280
281 #[test]
286 fn properties_mut_allows_mutation_via_enum() {
287 let mut doc = make_doc();
288 doc.properties_mut().insert("x".into(), Value::U64(5));
289 assert_eq!(doc.properties().get("x"), Some(&Value::U64(5)));
290 }
291
292 #[test]
297 fn setters_forward_all_fields_to_v0() {
298 let mut doc = make_doc();
299 doc.set_id(Identifier::new([42u8; 32]));
300 doc.set_owner_id(Identifier::new([43u8; 32]));
301 let mut p = BTreeMap::new();
302 p.insert("z".into(), Value::Bool(true));
303 doc.set_properties(p.clone());
304 doc.set_revision(Some(99));
305 doc.set_created_at(Some(1_000_000));
306 doc.set_updated_at(Some(2_000_000));
307 doc.set_transferred_at(Some(3_000_000));
308 doc.set_created_at_block_height(Some(111));
309 doc.set_updated_at_block_height(Some(222));
310 doc.set_transferred_at_block_height(Some(333));
311 doc.set_created_at_core_block_height(Some(4));
312 doc.set_updated_at_core_block_height(Some(5));
313 doc.set_transferred_at_core_block_height(Some(6));
314 doc.set_creator_id(Some(Identifier::new([7u8; 32])));
315
316 assert_eq!(doc.id(), Identifier::new([42u8; 32]));
317 assert_eq!(doc.owner_id(), Identifier::new([43u8; 32]));
318 assert_eq!(doc.properties(), &p);
319 assert_eq!(doc.revision(), Some(99));
320 assert_eq!(doc.created_at(), Some(1_000_000));
321 assert_eq!(doc.updated_at(), Some(2_000_000));
322 assert_eq!(doc.transferred_at(), Some(3_000_000));
323 assert_eq!(doc.created_at_block_height(), Some(111));
324 assert_eq!(doc.updated_at_block_height(), Some(222));
325 assert_eq!(doc.transferred_at_block_height(), Some(333));
326 assert_eq!(doc.created_at_core_block_height(), Some(4));
327 assert_eq!(doc.updated_at_core_block_height(), Some(5));
328 assert_eq!(doc.transferred_at_core_block_height(), Some(6));
329 assert_eq!(doc.creator_id(), Some(Identifier::new([7u8; 32])));
330 }
331
332 #[test]
339 fn bump_revision_via_enum_saturates_at_max() {
340 let mut doc = make_doc();
341 doc.set_revision(Some(Revision::MAX));
342 doc.bump_revision();
343 assert_eq!(doc.revision(), Some(Revision::MAX));
344 }
345
346 #[test]
347 fn bump_revision_via_enum_is_noop_for_none() {
348 let mut doc = make_doc();
349 doc.set_revision(None);
350 doc.bump_revision();
351 assert_eq!(doc.revision(), None);
352 }
353
354 #[test]
360 fn get_returns_property_by_path() {
361 let mut doc = make_doc();
362 doc.properties_mut().insert("a".into(), Value::U64(1));
363 assert_eq!(doc.get("a"), Some(&Value::U64(1)));
364 assert_eq!(doc.get("missing"), None);
365 }
366}