Skip to main content

ferroui_base/logging/
parametrized_logger.rs

1use std::any::Any;
2use std::fmt::Display;
3use std::rc::Rc;
4use std::sync::Arc;
5
6use super::{ILogSink, LogEventLevel};
7
8/// The sink a [`ParametrizedLogger`] writes to.
9#[derive(Clone)]
10pub(crate) enum SinkHandle {
11    Global(Arc<dyn ILogSink + Send + Sync>),
12    Thread(Rc<dyn ILogSink>),
13}
14
15impl SinkHandle {
16    #[inline]
17    pub(crate) fn get(&self) -> &dyn ILogSink {
18        match self {
19            SinkHandle::Global(sink) => &**sink,
20            SinkHandle::Thread(sink) => &**sink,
21        }
22    }
23}
24
25/// Logger sink parametrized for given logging level.
26#[derive(Clone)]
27pub struct ParametrizedLogger {
28    sink: SinkHandle,
29    level: LogEventLevel,
30    area: &'static str,
31}
32
33impl ParametrizedLogger {
34    /// Creates a logger that writes to `sink` with the given level and area.
35    pub fn new(sink: Rc<dyn ILogSink>, level: LogEventLevel, area: &'static str) -> Self {
36        Self { sink: SinkHandle::Thread(sink), level, area }
37    }
38
39    pub(crate) fn from_handle(sink: SinkHandle, level: LogEventLevel, area: &'static str) -> Self {
40        Self { sink, level, area }
41    }
42
43    /// Checks if this logger can be used.
44    pub fn is_valid(&self) -> bool {
45        true
46    }
47
48    /// Logs an event.
49    ///
50    /// `source` is the object from which the event originates.
51    #[inline]
52    pub fn log(&self, source: Option<&dyn Any>, message_template: &str) {
53        self.sink.get().log(self.level, self.area, source, message_template);
54    }
55
56    /// Logs an event with message property values, given in the order of
57    /// the `{Placeholders}` of the template.
58    #[inline]
59    pub fn log_with_values(&self, source: Option<&dyn Any>, message_template: &str, property_values: &[&dyn Display]) {
60        self.sink.get().log_with_values(self.level, self.area, source, message_template, property_values);
61    }
62}