Skip to main content

systemprompt_database/scope/
registry.rs

1//! Inventory-based registration for [`ConnectionScopeProvider`]s.
2//!
3//! Copyright (c) systemprompt.io — Business Source License 1.1.
4//! See <https://systemprompt.io> for licensing details.
5
6use std::sync::OnceLock;
7
8use super::provider::SharedScopeProvider;
9
10/// One inventory submission per [`crate::register_scope_provider!`] call.
11#[derive(Debug, Clone, Copy)]
12pub struct ScopeProviderRegistration {
13    pub factory: fn() -> SharedScopeProvider,
14}
15
16inventory::collect!(ScopeProviderRegistration);
17
18#[must_use]
19pub fn discover_scope_providers() -> Vec<SharedScopeProvider> {
20    inventory::iter::<ScopeProviderRegistration>()
21        .map(|reg| (reg.factory)())
22        .collect()
23}
24
25#[must_use]
26pub fn scope_providers() -> &'static [SharedScopeProvider] {
27    static PROVIDERS: OnceLock<Vec<SharedScopeProvider>> = OnceLock::new();
28    PROVIDERS.get_or_init(discover_scope_providers)
29}
30
31#[macro_export]
32macro_rules! register_scope_provider {
33    ($factory:expr) => {
34        ::inventory::submit! {
35            $crate::scope::ScopeProviderRegistration {
36                factory: $factory,
37            }
38        }
39    };
40}