rust_bus 3.0.6

bus — Lightweight CQRS Library for Rust
Documentation
use crate::{BusError, dispatch};

pub(crate) fn init_memory_handlers() -> Result<(usize, usize), BusError> {
    let mut mem_map = std::collections::HashMap::new();
    let mut mem_handlers_total = 0;

    for reg in inventory::iter::<dispatch::registration::EventHandlerRegistration>() {
        let entries = mem_map
            .entry(reg.event_identity)
            .or_insert_with(Vec::<&'static dispatch::registration::EventHandlerRegistration>::new);

        if let Some(entry) = entries.first()
            && entry.event_identity != reg.event_identity
        {
            return Err(BusError::Configuration(format!(
                "Event struct mismatch for identity '{}': handlers '{}' and '{}' use different Rust types",
                reg.event_identity, entry.handler_identity, reg.handler_identity
            )));
        }

        #[cfg(feature = "context")]
        if let Some(entry) = entries.first()
            && entry.context_identity != reg.context_identity
        {
            return Err(BusError::Configuration(format!(
                "Context mismatch for memory event '{}': handler '{}' requires {}, but handler '{}' requires {}",
                reg.event_identity,
                entry.handler_identity,
                entry.context_identity,
                reg.handler_identity,
                reg.context_identity
            )));
        }

        #[cfg(feature = "logging")]
        log::debug!(
            "Registered memory handler: {} for event: {}",
            reg.handler_identity,
            reg.event_identity
        );

        entries.push(reg);
        mem_handlers_total += 1;
    }

    let mem_events_count = mem_map.len();
    dispatch::registration::MEMORY_HANDLERS
        .set(mem_map)
        .map_err(|_| BusError::Configuration("Memory handlers already initialized".to_string()))?;

    Ok((mem_events_count, mem_handlers_total))
}