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 }