Skip to main content

razeri_plugin_api/
registry.rs

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