from __future__ import annotations from dataclasses import dataclass from core.base import BaseRenderer, BaseTransport from core.plugin_types import PluginGroupConfig, PluginLoadError, discover_plugins from core.schemas.config import PluginPackagesConfig from reporting.registry import RendererRegistry from reporting.transport_registry import TransportRegistry @dataclass(frozen=True) class ReportingBootstrapResult: renderer_registry: RendererRegistry transport_registry: TransportRegistry errors: list[PluginLoadError] def bootstrap_reporting(plugin_packages: PluginPackagesConfig) -> ReportingBootstrapResult: renderer_descriptors, renderer_errors = discover_plugins( PluginGroupConfig( package_names=plugin_packages.renderers, entry_point_group="hydrogen.renderers", plugin_kind="renderer", ), BaseRenderer, ) transport_descriptors, transport_errors = discover_plugins( PluginGroupConfig( package_names=plugin_packages.transports, entry_point_group="hydrogen.transports", plugin_kind="transport", ), BaseTransport, ) errors = [*renderer_errors, *transport_errors] renderer_registry = RendererRegistry() for descriptor in renderer_descriptors: try: renderer_registry.register(descriptor.plugin) except ValueError as exc: errors.append( PluginLoadError( plugin_kind="renderer", source=descriptor.source, message=str(exc), ) ) transport_registry = TransportRegistry() for descriptor in transport_descriptors: try: transport_registry.register(descriptor.plugin) except ValueError as exc: errors.append( PluginLoadError( plugin_kind="transport", source=descriptor.source, message=str(exc), ) ) return ReportingBootstrapResult( renderer_registry=renderer_registry, transport_registry=transport_registry, errors=errors, ) def build_renderer_registry( plugin_packages: PluginPackagesConfig | None = None, ) -> RendererRegistry: return bootstrap_reporting(plugin_packages or PluginPackagesConfig()).renderer_registry def build_transport_registry( plugin_packages: PluginPackagesConfig | None = None, ) -> TransportRegistry: return bootstrap_reporting(plugin_packages or PluginPackagesConfig()).transport_registry