forge-foundation 0.3.3

Core Magic types for the manabrew engine: colors, mana, card types, zones, phases
Documentation
use std::collections::HashMap;
use std::sync::RwLock;

use super::print_sheet::PrintSheet;

static REGISTRY: RwLock<RegistryInner> = RwLock::new(RegistryInner::new());

struct RegistryInner {
    by_name: Option<HashMap<String, PrintSheet>>,
}

impl RegistryInner {
    const fn new() -> Self {
        Self { by_name: None }
    }
}

pub fn install(sheets: HashMap<String, PrintSheet>) {
    let mut guard = REGISTRY.write().expect("print sheet registry poisoned");
    guard.by_name = Some(sheets);
}

pub fn register(name: impl Into<String>, sheet: PrintSheet) {
    let mut guard = REGISTRY.write().expect("print sheet registry poisoned");
    guard
        .by_name
        .get_or_insert_with(HashMap::new)
        .insert(name.into(), sheet);
}

pub fn clear() {
    let mut guard = REGISTRY.write().expect("print sheet registry poisoned");
    guard.by_name = None;
}

pub fn get(name: &str) -> Option<PrintSheet> {
    let guard = REGISTRY.read().expect("print sheet registry poisoned");
    let table = guard.by_name.as_ref()?;
    if let Some(sheet) = table.get(name) {
        return Some(sheet.clone());
    }
    let key = name.to_ascii_lowercase();
    for (k, v) in table.iter() {
        if k.eq_ignore_ascii_case(&key) {
            return Some(v.clone());
        }
    }
    None
}

pub fn is_populated() -> bool {
    let guard = REGISTRY.read().expect("print sheet registry poisoned");
    guard.by_name.as_ref().is_some_and(|t| !t.is_empty())
}