1use log::{Level, LevelFilter};
2use std::path::Path;
3use crate::{
4 log_impl::LoggerSink,
5 formatter::LogFormat,
6 file_impl::LoggerSinkFile,
7};
8
9#[derive(Default)]
13pub struct Builder {
14
15 pub force: bool,
18
19 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
32
33impl Builder {
34
35 pub fn new() -> Self{
36 Self::default()
37 }
38
39 pub fn signal(mut self, signal: i32) -> Self {
41 self.rotation_signals.push(signal);
42 self
43 }
44
45 pub fn file(mut self, config: LogFile) -> Self {
47 self.sinks.push(Box::new(config));
48 self
49 }
50
51 pub fn get_max_level(&self) -> LevelFilter {
53 let mut max_level = Level::Error;
54 for sink in &self.sinks {
55 let level = sink.get_level();
56 if level > max_level {
57 max_level = level;
58 }
59 }
60 return max_level.to_level_filter();
61 }
62}
63
64pub trait SinkConfigTrait {
65
66 fn get_level(&self) -> Level;
67 fn get_file_path(&self) -> Option<Box<Path>>;
68 fn build(&self) -> LoggerSink;
69}
70
71pub struct LogFile {
73
74 pub dir: String,
76
77 pub level: Level,
79
80 pub name: String,
82
83 pub(crate) format: LogFormat,
84
85 pub file_path: Box<Path>,
87}
88
89impl LogFile {
90
91 pub fn new(dir: &str, name: &str, level: Level, format: LogFormat) -> Self {
92 let file_path = Path::new(dir).join(Path::new(name)).into_boxed_path();
93 Self{
94 dir: dir.to_string(),
95 name: name.to_string(),
96 level,
97 format,
98 file_path,
99 }
100 }
101}
102
103impl SinkConfigTrait for LogFile {
104
105 fn get_level(&self) -> Level {
106 self.level
107 }
108
109 fn get_file_path(&self) -> Option<Box<Path>> {
110 Some(self.file_path.clone())
111 }
112
113 fn build(&self) -> LoggerSink {
114 LoggerSink::File(LoggerSinkFile::new(self))
115 }
116}