1 use std::sync::mpsc;
2 
3 use log::LevelFilter;
4 use simple_logger::LogBackend;
5 
6 use crate::command::CommandLineArgs;
7 
8 /// Initialize the logging system.
init(cmd_args: &CommandLineArgs) -> LoggingInitResult9 pub fn init(cmd_args: &CommandLineArgs) -> LoggingInitResult {
10     let mut builder = simple_logger::SimpleLogger::new().with_level(LevelFilter::Info);
11 
12     let mut result = LoggingInitResult::new(None);
13 
14     if cmd_args.tui {
15         let channel: (mpsc::Sender<String>, mpsc::Receiver<String>) = mpsc::channel::<String>();
16         builder = builder.with_backend(Box::new(TUILoggingBackend::new(channel.0)));
17         result.tui_receiver = Some(channel.1);
18     }
19 
20     builder.init().expect("failed to initialize logging");
21 
22     return result;
23 }
24 
25 #[derive(Debug)]
26 pub struct LoggingInitResult {
27     /// Logging backend receiver.
28     pub tui_receiver: Option<mpsc::Receiver<String>>,
29 }
30 
31 impl LoggingInitResult {
new(tui_receiver: Option<mpsc::Receiver<String>>) -> Self32     pub fn new(tui_receiver: Option<mpsc::Receiver<String>>) -> Self {
33         Self { tui_receiver }
34     }
35 }
36 
37 pub struct TUILoggingBackend {
38     sender: mpsc::Sender<String>,
39 }
40 
41 impl TUILoggingBackend {
new(sender: mpsc::Sender<String>) -> Self42     pub fn new(sender: mpsc::Sender<String>) -> Self {
43         Self { sender }
44     }
45 }
46 
47 impl LogBackend for TUILoggingBackend {
log(&self, message: String)48     fn log(&self, message: String) {
49         self.sender.send(message).ok();
50     }
51 }
52