1use crate::{file_impl::LoggerSinkFile, formatter::LogFormat, log_impl::LoggerSink};
2use log::{Level, LevelFilter};
3use std::path::Path;
4
5#[derive(Default)]
9pub struct Builder {
10 pub dynamic: bool,
17
18 pub rotation_signals: Vec<i32>,
21
22 pub panic: bool,
24
25 pub continue_when_panic: bool,
27
28 pub sinks: Vec<Box<dyn SinkConfigTrait>>,
30}
31
32impl Builder {
33 pub fn new() -> Self {
34 Self::default()
35 }
36
37 pub fn signal(mut self, signal: i32) -> Self {
39 self.rotation_signals.push(signal);
40 self
41 }
42
43 pub fn file(mut self, config: LogFile) -> Self {
45 self.sinks.push(Box::new(config));
46 self
47 }
48
49 pub fn get_max_level(&self) -> LevelFilter {
51 let mut max_level = Level::Error;
52 for sink in &self.sinks {
53 let level = sink.get_level();
54 if level > max_level {
55 max_level = level;
56 }
57 }
58 return max_level.to_level_filter();
59 }
60}
61
62pub trait SinkConfigTrait {
63 fn get_level(&self) -> Level;
64 fn get_file_path(&self) -> Option<Box<Path>>;
65 fn build(&self) -> LoggerSink;
66}
67
68pub struct LogFile {
70 pub dir: String,
72
73 pub level: Level,
75
76 pub name: String,
78
79 pub(crate) format: LogFormat,
80
81 pub file_path: Box<Path>,
83}
84
85impl LogFile {
86 pub fn new(dir: &str, name: &str, level: Level, format: LogFormat) -> Self {
87 let file_path = Path::new(dir).join(Path::new(name)).into_boxed_path();
88 Self { dir: dir.to_string(), name: name.to_string(), level, format, file_path }
89 }
90}
91
92impl SinkConfigTrait for LogFile {
93 fn get_level(&self) -> Level {
94 self.level
95 }
96
97 fn get_file_path(&self) -> Option<Box<Path>> {
98 Some(self.file_path.clone())
99 }
100
101 fn build(&self) -> LoggerSink {
102 LoggerSink::File(LoggerSinkFile::new(self))
103 }
104}