verticopolis_engine/catalog/
json.rs1use serde_json::Value;
4use std::sync::OnceLock;
5
6use super::{catalog, lock_view};
7use crate::canonical::{canonical_json, digest};
8use crate::clock::GameMode;
9
10fn shared_catalog_value(mode: GameMode) -> &'static Value {
14 static CLASSIC: OnceLock<Value> = OnceLock::new();
15 static MODERN: OnceLock<Value> = OnceLock::new();
16 let cell = match mode {
17 GameMode::Classic => &CLASSIC,
18 GameMode::Modern => &MODERN,
19 };
20 cell.get_or_init(|| serde_json::to_value(catalog(mode)).expect("the catalog serializes"))
21}
22
23pub fn catalog_value(mode: GameMode) -> Value {
25 shared_catalog_value(mode).clone()
26}
27
28pub fn catalog_json(mode: GameMode) -> String {
31 canonical_json(shared_catalog_value(mode))
32}
33
34pub fn catalog_digest(mode: GameMode) -> String {
38 digest(&lock_view(shared_catalog_value(mode)))
39}