Skip to main content

razeri_plugin_api/
registry.rs

1// Copyright (C) 2026 Gabriel Shea <gshea@ideapivot.com> - All Rights Reserved
2
3//! Unified plugin registry aggregating all sub-registries.
4//!
5//! [`PluginRegistry`] is the single composition root that holds all
6//! extension point registries. It is constructed via [`crate::builder::PluginRegistryBuilder`].
7
8use crate::dialect::PlatformRegistry;
9use crate::event::EventRegistry;
10use crate::language::LanguageRegistry;
11use crate::llm::LlmRegistry;
12use crate::model::ModelRegistry;
13use crate::storage::StorageRegistry;
14
15/// Aggregates all sub-registries into a single composition root.
16///
17/// Created by [`crate::builder::PluginRegistryBuilder::build()`].
18pub struct PluginRegistry {
19    /// Database dialect registry (enum-keyed + string-keyed).
20    pub dialects: PlatformRegistry,
21    /// Storage provider factory registry (enum-keyed + string-keyed).
22    pub storage: StorageRegistry,
23    /// LLM provider factory registry (string-keyed).
24    pub llm: LlmRegistry,
25    /// Model adapter registry ((provider, model) keyed).
26    pub models: ModelRegistry,
27    /// Language renderer factory registry (string-keyed).
28    pub language: LanguageRegistry,
29    /// Event sink registry (fan-out to all sinks).
30    pub events: EventRegistry,
31}
32
33#[cfg(test)]
34mod tests {
35    use crate::builder::PluginRegistryBuilder;
36
37    #[test]
38    fn empty_builder_creates_empty_registry() {
39        let registry = PluginRegistryBuilder::new().build();
40        assert_eq!(registry.dialects.list().len(), 0);
41        assert_eq!(registry.llm.list().len(), 0);
42        assert!(registry.events.is_empty());
43    }
44}