logging.rs 1.2 KB

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