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}