world_owner_counts/
world_owner_counts.rs1use brdb::{Brdb, IntoReader, OwnerTableSoA};
2use serde::Serialize;
3use std::{
4 env,
5 path::{self, PathBuf},
6 process,
7};
8
9#[derive(Serialize)]
10struct Row {
11 user_id: String,
12 user_name: String,
13 display_name: String,
14 entity_counts: u32,
15 brick_counts: u32,
16 component_counts: u32,
17 wire_counts: u32,
18}
19
20fn main() -> Result<(), Box<dyn std::error::Error>> {
22 let mut args = std::env::args().into_iter();
23 args.next();
24 let Some(file) = args.next() else {
25 eprintln!("missing world file arg");
26 process::exit(1);
27 };
28
29 let dst = env::current_dir()?.join(PathBuf::from(&file));
30 if !dst.exists() {
31 eprintln!("file {} does not exist", dst.display());
32 process::exit(1);
33 }
34
35 eprintln!("Opening world: {}", path::absolute(&dst)?.display());
36
37 let db = Brdb::open(dst)?.into_reader();
38
39 let owners_soa = db.owners_soa()?.to_value();
40 let owners = OwnerTableSoA::try_from(&owners_soa)?;
41
42 let rows = (0..owners.user_ids.len())
43 .map(|i| {
44 let user_id = &owners.user_ids[i];
45 let display_name = &owners.display_names[i];
46 let user_name = &owners.user_names[i];
47 let entity_count = owners.entity_counts[i];
48 let brick_count = owners.brick_counts[i];
49 let component_count = owners.component_counts[i];
50 let wire_count = owners.wire_counts[i];
51 Row {
52 user_id: user_id.uuid().to_string(),
53 user_name: user_name.clone(),
54 display_name: display_name.clone(),
55 entity_counts: entity_count,
56 brick_counts: brick_count,
57 component_counts: component_count,
58 wire_counts: wire_count,
59 }
60 })
61 .collect::<Vec<_>>();
62 print!("{}", serde_json::to_string_pretty(&rows)?);
63
64 Ok(())
65}