Skip to main content

ferroui_splat/logging/
modules.rs

1//! `SplatLoggerModule` and `SplatLogManagerModule` (`Splat.Logging/Builder`).
2
3use super::{DebugLogger, DefaultLogManager, ILogManager, ILogger};
4use crate::builder::IModule;
5use crate::service_location::{
6    IMutableDependencyResolver, IReadonlyDependencyResolver, MutableDependencyResolverExt,
7};
8use std::rc::Rc;
9
10/// A module that registers a [`DebugLogger`] as `dyn ILogger` when none is registered
11/// (`SplatLoggerModule`).
12#[derive(Default)]
13pub struct SplatLoggerModule;
14
15impl SplatLoggerModule {
16    /// The module.
17    pub fn new() -> Self {
18        Self
19    }
20}
21
22impl IModule for SplatLoggerModule {
23    fn configure(&self, resolver: &dyn IMutableDependencyResolver) {
24        if resolver.has_registration::<dyn ILogger>() {
25            return;
26        }
27        let debug_logger: Rc<dyn ILogger> = Rc::new(DebugLogger::new());
28        resolver.register::<dyn ILogger>(move || Some(debug_logger.clone()));
29    }
30}
31
32/// A module that registers a [`DefaultLogManager`] over a resolver as `dyn ILogManager` when none
33/// is registered (`SplatLogManagerModule`).
34pub struct SplatLogManagerModule {
35    current: Rc<dyn IReadonlyDependencyResolver>,
36}
37
38impl SplatLogManagerModule {
39    /// The module, whose log manager takes its loggers from `current`.
40    pub fn new(current: Rc<dyn IReadonlyDependencyResolver>) -> Self {
41        Self { current }
42    }
43}
44
45impl IModule for SplatLogManagerModule {
46    fn configure(&self, resolver: &dyn IMutableDependencyResolver) {
47        if resolver.has_registration::<dyn ILogManager>() {
48            return;
49        }
50        let current = self.current.clone();
51        resolver.register::<dyn ILogManager>(move || {
52            Some(Rc::new(DefaultLogManager::new(current.clone())) as Rc<dyn ILogManager>)
53        });
54    }
55}