lib

Core libraries for Radroots
git clone https://radroots.dev/git/lib.git
Log | Files | Refs | README | LICENSE

logging.rs (2386B)


      1 use crate::error::{NetError, Result};
      2 use std::path::PathBuf;
      3 use tracing::info;
      4 
      5 #[derive(Debug, Clone)]
      6 pub struct LoggingOptions {
      7     pub dir: Option<PathBuf>,
      8     pub file_name: String,
      9     pub also_stdout: bool,
     10 }
     11 
     12 impl Default for LoggingOptions {
     13     fn default() -> Self {
     14         Self {
     15             dir: None,
     16             file_name: "radroots_net.log".into(),
     17             also_stdout: true,
     18         }
     19     }
     20 }
     21 
     22 pub fn init_logging(opts: LoggingOptions) -> Result<()> {
     23     let log_opts = radroots_log::LoggingOptions {
     24         dir: opts.dir.clone(),
     25         file_name: opts.file_name.clone(),
     26         stdout: opts.also_stdout,
     27         default_level: None,
     28         file_layout: radroots_log::LogFileLayout::PrefixedDate,
     29     };
     30     match radroots_log::init_logging(log_opts) {
     31         Ok(()) => {}
     32         Err(_) => return Err(NetError::LoggingInit("init")),
     33     }
     34     let file_path = opts
     35         .dir
     36         .as_ref()
     37         .map(|d| d.join(&opts.file_name).display().to_string())
     38         .unwrap_or_else(|| "<disabled>".into());
     39     info!(
     40         "logging initialized (file: {}, stdout: {})",
     41         file_path, opts.also_stdout
     42     );
     43     Ok(())
     44 }
     45 
     46 #[cfg(test)]
     47 mod tests {
     48     use super::{LoggingOptions, init_logging};
     49     use crate::error::NetError;
     50     use std::path::PathBuf;
     51 
     52     #[test]
     53     fn logging_options_default_values_are_stable() {
     54         let defaults = LoggingOptions::default();
     55         assert_eq!(defaults.dir, None);
     56         assert_eq!(defaults.file_name, "radroots_net.log");
     57         assert!(defaults.also_stdout);
     58     }
     59 
     60     #[test]
     61     fn init_logging_covers_error_and_success_paths() {
     62         let invalid = init_logging(LoggingOptions {
     63             dir: Some(PathBuf::from("/dev/null/file")),
     64             file_name: "x.log".to_string(),
     65             also_stdout: false,
     66         });
     67         assert!(matches!(invalid, Err(NetError::LoggingInit("init"))));
     68 
     69         let valid_with_dir = init_logging(LoggingOptions {
     70             dir: Some(std::env::temp_dir().join("radroots_net-log-tests")),
     71             file_name: "ok.log".to_string(),
     72             also_stdout: false,
     73         });
     74         assert!(valid_with_dir.is_ok());
     75 
     76         let valid_without_dir = init_logging(LoggingOptions {
     77             dir: None,
     78             file_name: "ok2.log".to_string(),
     79             also_stdout: true,
     80         });
     81         assert!(valid_without_dir.is_ok());
     82     }
     83 }