Skip to main content

world_owner_counts/
world_owner_counts.rs

1use 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
20/// Opens a world and prints out the counts
21fn 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}