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}