ferroui_base/logging/
parametrized_logger.rs1use std::any::Any;
2use std::fmt::Display;
3use std::rc::Rc;
4use std::sync::Arc;
5
6use super::{ILogSink, LogEventLevel};
7
8#[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#[derive(Clone)]
27pub struct ParametrizedLogger {
28 sink: SinkHandle,
29 level: LogEventLevel,
30 area: &'static str,
31}
32
33impl ParametrizedLogger {
34 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 pub fn is_valid(&self) -> bool {
45 true
46 }
47
48 #[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 #[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}