Skip to main content

ferroui_splat/service_location/
service_location_initialization.rs

1//! `ServiceLocationInitializationExtensions`: the default services of Splat.
2
3use super::app_locator::AppLocator;
4use super::dependency_resolver::{IMutableDependencyResolver, MutableDependencyResolverExt};
5use crate::application_performance_monitoring::{
6    DefaultFeatureUsageTrackingManager, IFeatureUsageTrackingManager,
7};
8use crate::logging::{DebugLogger, DefaultLogManager, ILogManager, ILogger};
9use std::rc::Rc;
10
11/// Registers the default services of Splat that are not registered yet (`InitializeSplat`): a
12/// [`DefaultLogManager`] over the current resolver as `dyn ILogManager`, a [`DebugLogger`] as
13/// `dyn ILogger` and a [`DefaultFeatureUsageTrackingManager`] as
14/// `dyn IFeatureUsageTrackingManager`.
15pub fn initialize_splat<R: IMutableDependencyResolver + ?Sized>(resolver: &R) {
16    register_default_log_manager(resolver);
17    register_logger(resolver);
18    register_application_performance_monitoring(resolver);
19}
20
21fn register_application_performance_monitoring<R: IMutableDependencyResolver + ?Sized>(resolver: &R) {
22    if resolver.has_registration::<dyn IFeatureUsageTrackingManager>() {
23        return;
24    }
25    resolver.register_constant::<dyn IFeatureUsageTrackingManager>(Rc::new(
26        DefaultFeatureUsageTrackingManager::new(),
27    ));
28}
29
30fn register_default_log_manager<R: IMutableDependencyResolver + ?Sized>(resolver: &R) {
31    if resolver.has_registration::<dyn ILogManager>() {
32        return;
33    }
34    resolver.register::<dyn ILogManager>(|| {
35        Some(Rc::new(DefaultLogManager::new(AppLocator::current())) as Rc<dyn ILogManager>)
36    });
37}
38
39fn register_logger<R: IMutableDependencyResolver + ?Sized>(resolver: &R) {
40    if resolver.has_registration::<dyn ILogger>() {
41        return;
42    }
43    resolver.register_constant::<dyn ILogger>(Rc::new(DebugLogger::new()));
44}
45
46/// `InitializeSplat` as a method of every resolver.
47pub trait ServiceLocationInitializationExt {
48    /// `InitializeSplat`.
49    fn initialize_splat(&self);
50}
51
52impl<R: IMutableDependencyResolver + ?Sized> ServiceLocationInitializationExt for R {
53    fn initialize_splat(&self) {
54        initialize_splat(self);
55    }
56}