1use onestore::{RevisionIndex, Store};
2use std::{env, fs};
3
4fn main() -> Result<(), Box<dyn std::error::Error>> {
5 for path in env::args_os().skip(1) {
6 let bytes = fs::read(&path)?;
7 let store = Store::parse(&bytes)?;
8 let index = RevisionIndex::parse(&store)?;
9 index
10 .validate_current()
11 .map_err(|error| format!("{path:?}: {error}"))?;
12 for (id, space) in &index.spaces {
13 for rid in space.revisions.keys() {
14 let resolved = index
15 .resolve(*id, *rid)
16 .map_err(|error| format!("{path:?}: {id} / {rid}: {error}"))?;
17 resolved
18 .reachable()
19 .map_err(|error| format!("{path:?}: {id} / {rid}: {error}"))?;
20 for object in resolved.objects.values() {
21 if let Some(onestore::FileDataReference::Internal(guid)) =
22 object.file_reference()?
23 {
24 store.file_data(guid)?;
25 }
26 if let onestore::ObjectData::Properties(bytes) = object.data {
27 onestore::PropertySets::parse(bytes)?;
28 }
29 }
30 }
31 }
32 let revisions: usize = index
33 .spaces
34 .values()
35 .map(|space| space.revisions.len())
36 .sum();
37 println!(
38 "{:?}: {} object spaces, {revisions} revisions",
39 path,
40 index.spaces.len()
41 );
42 }
43 Ok(())
44}